1989년 팀 버너스 리(Tim Berners-Lee)가 월드와이드웹(WWW, World Wide Web)을 발명한 후 2000년대에 웹 시스템들과 웹 관련 기술들이 엄청난 발전을 하였다.
당시의 웹 서버는 단순히 웹 브라우저가 요청하는 해당 페이지를 보내 주는 정도의 기능만 가능했다.
예를 들어, /news.html 페이지를 웹 브라우저가 요청하면 해당 HTML 페이지를 보내 준다. 그러면 웹 브라우저는 웹 서버에서 전달받은 HTML 파일을 렌더링하여 사용자에게 보여 준다.
간단하지만 정적인(static) 페이지만 보여 줄 수 밖에 없는 구조이다.
자바스크립트의 역할
단순했던 웹 서비스들이 조금씩 복잡해지기 시작하면서 사용자 인터랙션(user interaction)이 중요해지기 시작한다.
정적인 데이터나 문서만을 보여주는 것이 아니라 동적인 상호작용이 중요해지기 시작했다.
따라서 웹 브라우저에서 실행이 가능한 프로그래밍 언어인 자바스크립트의 역할이 커지기 시작했다.
웹 서버가 HTML뿐만 아니라 동적인 기능을 구현하는 자바스크립트 코드까지 웹 브라우저에 전송하면 웹 브라우저는 서버에서 전달받은 자바스크립트 코드를 실행하여 동적인 기능이 사용자에게 제공되도록 한다.
프론트엔드와 백엔드
자바스크립트가 주가 되면서 SPA(Single Page Application)방식의 프론트엔드 개발이 인기를 얻게 되었다.
페이지 렌더링(rendering)하는 데 필요한 자바스크립트 코드는 최초의 통신에서 한 번에 받으므로 그 다음부터는 서버와 데이터만 주고받으면 된다.
이렇게 자연스럽게 프론트엔드 서버와 백엔드 서버가 나뉘게 된다.
프론트엔드
주로 시스템의 UI(User Interface)와 UX(User eXperience) 부분을 구현하는 역할을 담당한다.
HTML, CSS 그리고 자바스크립트 기술이 주로 사용 되고, ReactJS, AngularJS, Webpack, npm, 그리고 그 외 여러 자바스크립트 프레임워크 및 라이브러리가 사용된다.
백엔드
프론트엔드 시스템 혹은 다른 클라이언트 시스템과 데이터를 실시간으로 주고받을 수 있는 기능을 구현하는 역할을 담당한다.
최대한 빠른 속도로 처리할 수 있는 시스템을 구현하는 것이 백엔드 개발자의 중요한 역할이 된다.
대표적으로 Java, Scala, Rust, Python 등이 있다.
처리 용량이나 속도가 크게 중요하지 않은 시스템은 Ruby, PHP 등으로 개발한다.
최근에는 NodeJS라는 자바스크립트 엔진이 인기를 얻으며 자바스트립트로 구현된 백엔드 시스템도 늘어나는 추세이다. 자바스크립트를 사용하여 프론트엔드와 백엔드 둘 다 구현할 수 있다는 장점이 있다.
현대 웹 시스템들의 구조 및 아키텍처
현대 웹 시스템 아키텍처
현대에는 웹 시스템 규모가 커지고 처리해야 하는 동시 요청 수, 데이터의 규모가 기하급수적으로 증가하면서 웹 시스템 아키텍처 또한 방대해지고 복잡해졌다.
API 시스템들이 방대해지고 복잡해지는 문제를 해결하기 위해서 MSA(Micro Service Architecture) 같은 새로운 아키텍처 개념이 발전되고, API 서버들이 훨씬 더 세분화되며 규모가 커지게 된다.
또한 분석해야 하는 데이터의 양이 늘어나면서 ETL(Extract, Transfer, Load) 혹은 Data Pipeline 시스템이 발전하게 되며, Hadoop 등 대용량 분석 프레임워크 등의 발달로 "Big Data" 분석 시스템이 많은 회사들의 백엔드 시스템에 도입된다.
백엔드 개발자로 입문하면 주로 API 시스템 구현부터 시작하게 된다.
현대 개발팀의 구조
기획자(product manager)
기획자(PM, Product Manager)는 개발하고자 하는 서비스를 정의하고 기획하는 역할을 담당한다.
개발하려는 시스템이 주는 가치 정의
세세한 기능들의 기획 및 정의를 구현
지속적으로 고객들의 피드백을 반영하면서 기능들의 정의와 기획을 발전시키는 역할
디자이너(designer)
일반적으로 웹 시스템 개발에는 UI(User Interface) 및 UX(User eXperience)를 구현하는 역할 담당
사용자(User)가 직접 경험할 수 있는 부분들을 사용자가 좋아하고 편리해 할 수 있게 디자인하는 역할
프론트엔드 개발자(frontend developer)
프론트엔드 시스템을 구현하는 역할을 맡는 개발자
우리나라에는 HTML과 CSS 부분만을 담당하는 퍼블리셔(publisher)라는 직군이 따로 있다.
백엔드 개발자(backend developer)
백엔드 시스템을 개발하는 역할
좀 더 앞쪽 부분을 담당하는 API 개발자, 더 뒤쪽 부분, 즉 데이터 수집, 분석, 관리 등의 데이터 관련 시스템을 개발하는 개발자로 나눌 수 있다.
API 개발과 데이터 관련 시스템 개발은 서로 많이 다르고, 데이터 관리, 분석 시스템 구현이 API 구현보다 더 난이도가 높아서 경력이 높은 개발자가 보통 뒷부분에 해당하는 시스템을 구현한다.
데브옵스(DevOps)
"Development"와 "Operation"의 합성어로, 직군이라기 보다는 개발 분야에서 나타나는 문화나 추세가 더 정확하다.
이름 그대로 개발뿐만 아니라 시스템 운영까지 담당하는 것을 이야기한다.
AWS 등의 클라우드 서비스가 발달함에 따라 서버 구축 및 운영 등의 시스템 인프라 스트럭처(infrastructure) 구축과 관리를 하는 데 있어 실제 서버 하드웨어를 직접 다루지 않아도 되게 되었다.
따라서 자연스럽게 시스템 운영(system operation) 담당자가 따로 필요없이 개발자들이 직접 시스템 인프라스트럭처를 구현하는 추세가 퍼지게 되었다.
빌드, 테스트, 배포 등 개발에서 배포까지 과정을 자동화하여 전체적인 사이클(cycle)을 효율적으로 진행될 수 있는 개발 환경을 구축
풀스택 개발자(full stack developer)
프론트엔드, 백엔드 개발 둘 다 가능한 개발자
스타트업같은 소규모 기업에서 리소스(resource)가 제한적일 수밖에 없어서 풀스택 개발자를 주로 원한다.
시스옵스(SysOps, System Operations)
데브옵스와 다르게 실제 하드웨어를 다룰 수 있는 직군
시스템 인프라스트럭처(system infrastructure)의 구현과 관리 및 운영을 담당
서버를 직접 설치하고 운영
그 외 물리적인 네트워크 구축 및 운영 등 시스템 인프라스트럭처 운영에 필요한 모든 부분 담당
주로 직접 데이터 센터(data center)를 사용하여 시스템을 운영하는 회사에 필요한 직군
AWS 등의 클라우드 서비스가 널리 사용되며 시스옵스에 대한 수요가 많이 줄어들었다.
데이터 사이언티스트(data scientist)
데이터 분석에 필요한 알고리즘과 모델링의 구현을 담당
많은 양의 데이터를 분석해서 새로운 정보와 가치를 만들어 낼 수 있는 직군
데이터 엔지니어(data engineer)
데이터 사이언티스트와 함께 일하는 직군
데이터 사이언티스트가 데이터를 분석할 수 있도록 데이터를 정리하고 정석화시키는 시스템 구현
테스터(tester)
시스템을 테스트하여 검증하는 역할 담당
크게 2가지 역할로 구분되는데, 하나는 QA 테스터(Quality Assurance Tester)로 직접 손으로 테스트하는 메뉴얼 테스팅(manual testing)을 담당한다. 다른 하나는 테스트 자동화 시스템을 구현하는 테스터이다.
스크럼 마스터(scrum master)
스크럼 개발론이 널리 사용되면서 새로 생겨난 직군
생산성을 높이기 위해 도입했지만, 정작 제대로 스크럼을 사용하지 못하여 개발성이 그다지 높아지지 않은 문제가 발생했다. 따라서 제대로 사용할 수 있도록 코치(coach)해 주고 이끌어 주는 역할