Express 와 MongoDB로 Azure 배포까진 할 수 있지만…

프론트 기술을 파기 위해, 클린코드를 다루었고 목표한 양을 충족했다.

공부 방향(1. Node.js & 백엔드, 2. Typescript, 3. Next)을 고민하던 중, 사수분께 물어보았고 Node.js와 백엔드를 연구해보라고 추천해주셔서, 이제부터 시작해보려고 한다.

예전 프로젝트에서 프록시서버가 필요하여 Express, MongoDB로 Azure에 웹앱 배포를 하여 직접사용해본적은 있지만 급하게 뚝딱뚝딱 만들다보니 너무 단순한 구조로 개발했던 기억이 있다.

메인은 프론트이지만, 백엔드도 스터디해서 백엔드 개발자분들과 원활히 소통하고 서로 피드백을 줄 수 있게 나를 성장시키고 싶다 ㅎㅎ

(이 책을 추천해준 친구에게 감사를!)


공부방법

  • 도서: ‘‘현업에서 쓰는 기술로 빡세게 배워서 개발자 되기 - Node.js 백엔드 개발자 되기(박승규 지음)’‘을 모르는 내용 위주로 목차깨기를 할 예정

1. VSCode 단축키 (몰랐던거 위주로 정리)

  • 주석 토글: Ctrl + /
  • 바꾸기: Ctrl + H
  • 전체 파일에서 찾기: Ctrl + Shift + F
  • 커서 아래 빈 줄 생성: Ctrl + enter
  • 터미널 열기/닫기: Ctrl + `(백틱)
  • 블럭 주석 처리: Alt + Shift + A
  • 같은 줄 추가: Shift + Alt + ↑ or ↓
  • 커서가 위치한 라인 선택하기: Ctrl + L

2. 백엔드 개발자를 위한 지식

1) 백엔드 개발자가 알아야 하는 것

아래는 백엔드 개발자가 알아야 하는 지식 로드맵을 책을 참고하여 직접 그려보았다. 배경색이 있는 항목들은 책에서 다루고 있는 내용이고, 차근차근 공부할 목표들이다.

image-20230809090646254

  • ‘백엔드’란, 클라이언트 또는 프론트엔드 영역의 요청을 컴퓨터가 수행하도록 하는 작업을 하는 사람이다.
  • 백엔드 개발자가 만든 프로그램을 서버라고 하는데, 이 서버는 1년 365일 24시간 내내 꺼지지 않는 컴퓨터에서 돌아간다. 서버는 주로 리눅스나 서버용 윈도우를 OS로 사용한다. 그러므로 서버에 대한 이해 + 서버 OS에 대한 학습이 필요하다.
  • 서버 OS는 그래픽 인터페이스를 사용하지 않고, 명령줄 인터페이스(CLI) 환경에서 운영한다. 따라서, 리눅스 명령어나 윈도우 CLI 명령어를 익혀 자유자재로 명령을 내릴 수 있어야 한다.
  • HTTP 요청을 받아 처리할 수 있는 프로그램을 실행시켜야 하는데, 서비스 방식에 따라 아래와 같이 2가지 유형(웹 서버, WAS)으로 나누어볼 수 있다.
    • 웹서버: 요청된 웹페이지나 정보를 제공하는 서버, 주로 정적인 콘텐츠를 제공. ex) 아파치, HTTP Server, Nginx, IIS
    • WAS: 동적인 웹 애플리케이션을 실행하는 데 사용되는 서버. 단독으로 사용하기 보다는 웹 서버 뒤에서 요청에 대한 응답을 제공. ex) 아파치 톰캣, 웹스피어, JEUS, IIS
  • WAS(Web Application Server)는 스프링이나 장고 같은 웹 프레임 워크를 실행시켜 요청받은 데이터를 처리하는 역할을 한다. 이 때, 데이터는 DB에 저장하게 되며, 클라이언트가 자주 요청하는 데이터는 캐시에 둔다.
  • WAS는 대부분 프레임워크를 사용하는데, 프레임워크는 개발에 필요한 예외 처리, 데이터베이스 연결, 외부 라이브러리 연동 등의 기능을 추상화해 제공해주어 개발자에게 비즈니스 로직 개발에 집중할 수 있게 도움을 준다.
  • 백엔드 개발자가 코딩을 한다고 말할 때가 보통 이 프레임워크를 두고 하는 말이다.
  • 배포는 개발하고 테스트가 완료된 코드를 서버에 전달(Deploy)하고 실행하는 것을 의미한다. 소스 코드의 배포는 아래 방식으로 정리할 수 있다.
    • 방식 1. 스크립트를 만들어서 배포하는 경우
    • 방식 2. 컨테이너 환경(도커)를 이용하여 개발과 실제 운영 서버의 환경을 동일하게 맞추어보고 테스트하는 환경에서는 ‘쿠버네티스’라는 기술을 사용하여 배포

2) 백엔드 개발자의 업무

백엔드 개발자의 주 업무는 서버사이드 애플리케이션을 개발하는 일이다.

  • 개발은 ‘분석 → 개발 → 테스트’ 사이클을 반복하면서 완성도를 높여야 한다.
  • 배포 방법은 여러 가지 방법이 있지만, 도커 같은 컨테이너 기술이 등장하면서 배포가 더욱 쉬워졌다. 도커와 같은 컨테이너 사용 시, ‘쿠버네티스’를 사용하면 배포와 관리를 쉽게 할 수 있는 장점이 있다.
  • 개발자는 코드의 개발부터 테스트, 배포, 모니터링까지 사실상 무한 반복을 한다.
    • CI(Continuous Integration): 지속적인 통합이라는 뜻. 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 ‘저장소’에 통합되는 것을 의미.
    • CD(Continuous Delivery & Continuous Deployment): 지속적인 배포라는 뜻. 실제 프로덕션 환경까지 변경된 코드가 반영되는 것을 의미.

3) 백엔드 아키텍처

규모가 있고 복잡한 서비스를 코딩해서 완성도 있게 하려면, 종합적인 분석, 계획, 정리, ‘아키텍쳐’가 필요하다.

  • ‘아키텍쳐’란? 총체적이고 종합적이고 상세하게 개발을 준비하는 것으로 정의한다. -출처: <소프트웨어 아키텍처 101>
  • 아키텍쳐에는 어느정도 정형화된 아래와 같은 3가지 패턴이 있으며, 3가지의 조합으로 실무에서 접하게 된다.
    • 패턴 1. 계층형 아키텍처
    • 패턴 2. 이벤트 기반 아키텍처
    • 패턴 3. 마이크로서비스 아키텍처
계층형 아키텍처
  • 계층형 아키텍처는 소프트웨어를 몇 가지 계층으로 나누어서 만드는 방식이다. 각 계층에서는 주어진 역할(프레젠테이션, 비즈니스 로직, 데이터 저장 등)을 수행하며, 의존성이 단방향이어야 한다.
    • 장점: 계층이 분리되어 있기 때문에 복잡도가 감소하며, 계층 내에서 관련 코드들의 응집도가 높다. 테스트도 쉽다.
    • 단점: 규모가 커지게 되면, 계층이 거대해지면서 유지보수가 힘들어지고, 개발속도가 떨어진다. 하나의 큰 덩어리를 여러 개 배포해야하므로 배포가 어렵다. (※TCP/IP 네트워크 계층은 계층형 아키텍처가 잘 적용된 예)

image-20230810084025204

<출처 - 57페이지, Node.js 백엔드 개발자 되기(박승규 지음)>

이벤트 기반 아키텍처

이벤트의 상태 변화에 대응하는 소프트웨어 설계패턴이다.

  • 이벤트 기반 아키텍처의 구성은 3가지이다.
    • 프로듀서: 이벤트를 발생시키는 역할
    • 브로커: 이벤트를 전달하는 역할
    • 컨슈머: 이벤트를 받는 역할
  • 이벤트 기반 아키텍처는 모든 요청을 비동기로 처리하기 때문에 아래와 같은 장점과 단점을 갖는다.
    • 장점: 확장성이 좋고 아키텍처 내 컴퓨넌트 간 의존성을 줄일 수 있다.
    • 단점: 이벤트 순서를 보장하기 어렵고, 에러가 발생했을 때 처리가 어렵다.

image-20230810084120141

<출처 - 58페이지, Node.js 백엔드 개발자 되기(박승규 지음)>

마이크로서비스 아키텍처

시스테을 여러 개의 작은 서비스로 나누어 관리하는 설계 방식이다.

  • 마이크로서비스 아키텍처는 작은 서비스로 나누어 관리하기 때문에 아래와 같은 장점과 단점을 갖는다.
    • 장점: 각 서비스는 독립적으로 업데이트 및 스케일링이 가능하고, 시스템 전체의 구조가 더욱 간결해진다. 대규모 시스템을 구축하는 데 유용하다.
    • 단점: 트랜잭션을 처리하려면 분산 태랜잭션 등을 고려해야하는데 난이도가 높다. 마이크로화된 모든 구성을 갖추어야 하므로 유지보수에 비용이 들어간다.

image-20230810084145165

<출처 - 59페이지, Node.js 백엔드 개발자 되기(박승규 지음)>

4) 백엔드 프로그래밍 언어

Java 프레임워크인 스프링이 강력하지만, 나는 프론트엔드로 개발을 시작하였고, 백엔드까지 아우르는 풀스택을 지원할 수 있는 언어인 ‘자바스크립트’를 채택하였다.

  • 자바스크립트 하나로 프론트엔드, 백엔드, 인프라 관리, 서버리스 지원, 앱 개발 등을 할 수 있어 첫시작으로 적합함.
  • 정적 타이핑을 지원하는 타입스크립트 도입도 고려해보자.
    • ‘타입스크립트’란? 자바스크립트의 슈퍼셋인 오픈소스 프로그래밍 언어. 마이크로소프트에서 개발, 유지보수하고 있으며 엄격한 문법을 지원.

5) 데이터베이스

데이터베이스는 데이터 저장 시 수많은 문제가 생길 수 있는 상황에서도 데이터를 안전하게 보관, 검색, 수정, 삭제가 가능하도록 하는 소프트웨어이다.

RDB

‘관계형 데이터베이스(Relational Database)’를 의미한다. 관계형 데이터베이스는 데이터를 행과 열로 이루어진 테이블로 관리하며, 기본 키(Primary key)를 사용해 각 행을 식별한다. RDB에는 오라클, MySQL, SQL 서버 등이 있다.

NoSQL(Not Only SQL)

RDB는 데이터 저장, 질의, 수정, 삭제가 용이하지만 성능을 올리는게 쉽지 않다.규모가 커지는 경우, ‘키 밸류 캐시, 키 밸류 스토어, 도큐먼트 스토어, 와이드 컬럼 스토어’를 사용한다.

키 밸류 캐스토어

맴캐시드와 레디스가 많이 사용된다. 멤캐시드는 키 밸류 형태의 데이터만 제공하며, 클러스터를 지원하여 분산 환경에서 편하게 사용할 수 있다. 레디스는 싱글 스레드라서 오래 걸리는 작업을 하면 서버가 멈추게 된다. 따라서 오래 걸리는

도큐먼트 스토어

JSON과 비슷한 BSON이라는 문서 모델을 저장한다. 몽고디비가 대표적이며, 테이블 개념인 컬렉션이라는 개념이 있고 검색 시 인덱스를 사용하거나 RDB에서 사용했던 기능을 많이 가져오려고 한다.

와이드 컬럼 스토어

RDB와 유사하게 행과 열 테이블을 사용한다.RDB와 다른 점은 행마다 열의 이름과 타입이 다를 수 있다다는 점이다. 2차원 키 밸류 저장소로 사용할 수도 있다. 대표적으로 구글의 빅테이블이 있으며, 아파치 카산드라고 있다. 카산드라는 확장성과 성능이 뛰어나다는 특징이 있다.

6) 클라우드 컴퓨팅의 유형

클라우드 서비스는 3가지가 있다. (AZ-900 자격증 시험에서 공부했던 적이 있지만, 한번더 정리) Paas 유형으로 실무에서 사용하는 것 같다.

  • IaaS(Infrastructure as a Service): 기존의 온프레미스의 인프라를 클라우드 서비스로 제공하는 것을 말한다. 서버, 스토리지, 네트워킹과 같은 컴퓨팅 자원을 사용한다.
  • PaaS(Platform as a Service): 인프라를 구축할 필요없이, 개발자가 코드만 작성하면 서버 환경이 구성되는 것을 의미한다. 관련 서비스로 AWS 일래스틱 빈스토크, 애저 앱 서비스 등이 있다.
  • SaaS(Software as a Service): 기존 패키지로 설치해야만 했던 애플리케이션을 브라우저를 통해 사용하도록 해주는 서비스를 의미한다. 구글 독스, MS 오피스 365 등이 있다.

참고

다음에 다루게 될 것

  • Node.js 서버를 k6로 실제 유저 트래픽으로 평가하기

댓글남기기