실전! Node.js 마이크로서비스 개발

자바스크립트를 이용한 마이크로서비스 구축부터 보안, 테스트, 배포까지

마이크로서비스의 개념을 이해하는 동시에 Node 10을 이용해 익스프레스로 개발, 도커로 배포하고 스웜과 쿠버네티스로 확장하는 방법을 배운다!

마이크로서비스는 함께 작동하지만 개별적으로 개발할 수 있는 작은 조각으로 소프트웨어를 개발하게 해준다. 이것이 여러 기업에서 마이크로서비스를 도입하는 주요한 이유다. 최근 몇 년간 Node.js는 애플리케이션의 생산성과 성능을 향상시키는 능력 덕분에 마이크로서비스 개발에 있어 유력한 후보로 등장했다.

《실전! Node.js 마이크로서비스 개발》은 모놀리식 애플리케이션을 분해하고 마이크로서비스 아키텍처를 도입하는 방법에 관한 완전한 안내서로서, 서비스 설계부터 모델링, 애플리케이션으로의 통합까지 전 과정을 보여준다. 마이크로서비스를 개발하고 배포하는 도구로는 도커를 이용한다. 애플리케이션에 기능을 추가할 때는 확장성을 중요하게 고려해야 하는데, 그래서 도커 스웜 및 쿠버네티스와 같이 마이크로서비스를 확장하기 위한 다양한 솔루션도 알아본다. 이러한 서비스를 확장하면서 동시에 테스트하고 배포하는 일은 상당히 어려울 수 있으며, 이 어려움을 극복하기 위해 애플리케이션 구축 프로세스를 여러 단계로 분할하는 배포 파이프라인을 설정한다. 그다음, 마이크로서비스를 위한 무서버 아키텍처와 기존 아키텍처에 비해 그것이 가진 장점을 살펴본다. 마지막으로 효율적인 마이크로서비스를 개발하기 위한 모범사례와 여러 디자인 패턴을 소개한다.

★ 이 책에서 다루는 내용 ★

  • 마이크로서비스의 개념
  • 히드라 및 세네카와 같은 여러 가지 서비스 아키텍처
  • 컨테이너를 사용하는 방법과 테스트 프로세스의 이해
  • 도커와 스웜을 사용한 지속적인 배포 및 확장
  • 마이크로서비스를 지역적으로 분산하는 방법
  • 클라우드 네이티브 마이크로서비스를 온라인 공급자에 배포
  • 마이크로서비스를 온라인 공급자로부터 독립적으로 유지하는 방법

디오고 헤센데 (Diogo Resende)

15년 이상의 경력이 있는 개발자이며, 거의 초창기부터 Node.js를 이용해 작업해왔다. 그는 다양한 산업과 통신 프로젝트에 참여한 경험을 통해 애플리케이션의 전반적인 성능에 영향을 미치는 여러 아키텍처 구성 요소와 접근 방식에 대한 광범위한 배경 지식을 얻었다.

최민석

2005년부터 번역 회사에서 언어 전문가로 일하다 독립한 후 현재는 IT 전문 번역가로 일하고 있다. 10년 이상 다양한 소프트웨어 현지화와 개발자 웹사이트 한글화 프로젝트를 진행했으며, 현재는 주요 IT 기업 제품의 한글화와 IT 전문 서적을 번역하는 일을 병행하고 있다. 번역한 책으로는 『유니티와 C#으로 배우는 게임 개발 교과서』(위키북스, 2015), 『엔터프라이즈 애플리케이션 아키텍처 패턴』(위키북스, 2015), 『네티 인 액션』(위키북스, 2016), 『유니티 5 셰이더와 이펙트 입문』(위키북스, 2017) 등이 있다.

  • ▣ 01장: 마이크로서비스의 시대
    • 마이크로서비스 소개
    • Node.js 소개
      • 모듈
      • 화살표 함수
      • 클래스
      • Promise와 async/await
      • 전개와 rest 구문
      • 함수 기본 매개변수
      • 구조 분해
      • 템플릿 리터럴
    • Node.js 사용의 장점
      • Node.js 패키지 매니저
      • 비동기 I/O
      • 커뮤니티
    • 일체형과 마이크로서비스
    • 마이크로서비스의 패턴
      • 분해 가능
      • 독자적
      • 확장 가능
      • 통신 가능
    • 마이크로서비스의 단점
    • 요약
    •  
  • ▣ 02장: 모듈과 도구 키트
    • 익스프레스(Express)
    • 마이크로(Micro)
    • 세네카(Seneca)
    • 히드라(Hydra)
    • 요약
    •  
  • ▣ 03장: 마이크로서비스 구축
    • 익스프레스 사용
      • 이미지 업로드
      • 폴더에 이미지가 있는지 확인
      • 이미지 다운로드
      • 경로 매개변수 사용
      • 썸네일 생성
      • 색을 이용한 간단한 작업
      • 경로 리팩터링
      • 이미지 조작
    • 히드라 사용
    • 세네카 사용
      • 플러그인
    • 요약
    •  
  • ▣ 04장: 상태와 보안
    • 상태
      • 상태 저장
      • MySQL
      • RethinkDB
      • 레디스(Redis)
      • 결론
    • 보안
    • 요약
    •  
  • ▣ 05장: 테스트
    • 테스트 방법론의 유형
    • 프레임워크 사용
    • 테스트 통합
      • chai 사용
      • 코드 커버리지 추가
      • 모든 코드 커버
    • 서비스 모의 객체 만들기
    • 요약
    •  
  • ▣ 06장: 마이크로서비스 배포
    • 가상 머신 사용
    • 컨테이너 사용
    • 도커를 사용한 배포
      • 이미지 생성
      • 도커파일 정의
      • 컨테이너 관리
      • 컨테이너 정리
    • MySQL 배포
    • 도커 컴포즈 사용
      • 도커 컴포즈 고급 활용
    • 요약
    •  
  • ▣ 07장: 확장, 샤딩, 복제
    • 네트워크 확장
    • 마이크로서비스 복제
    • 스웜으로 배포
      • 서비스 생성
      • 서비스 실행
      • 샤딩
      • 복제
      • 샤딩과 복제
    • 쿠버네티스로 이동
      • 쿠버네티스를 사용한 배포
    • 요약
    •  
  • ▣ 08장: 클라우드 네이티브 마이크로서비스
    • 클라우드 네이티브에 대한 대비
    • 클라우드 네이티브로 전환
      • 새로운 프로젝트 생성
      • 데이터베이스 서비스 배포
      • 쿠버네티스 클러스터 생성
      • 마이크로서비스 생성
      • 마이크로서비스 배포
    • 요약
    •  
  • ▣ 09장: 디자인 패턴
    • 패턴의 선택
      • 아키텍처 패턴
    • 패턴 사용
      • 마이크로서비스 계획
      • 개발의 장애물
    • 요약
  • 236~237쪽, YAML 설정 내용을 다음 내용으로 교체

    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
      name: rethinkdb-master
    spec:
      serviceName: rethinkdb-master
      replicas: 1
      template:
        metadata:
          labels:
            app: rethinkdb-master
        spec:
          hostname: rethinkdb-master
          containers:
          - name: rethinkdb
            image: rethinkdb:2.3.6
            command: ["rethinkdb"]
            args:
            - --bind
            - "all"
            - --canonical-address
            - "rethinkdb-master:29015"
            - --canonical-address
            - "$(MY_POD_IP):29015"
            volumeMounts:
            - name: rdb-local-data
              mountPath: /data
            env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumes:
          - name: rdb-local-data
            hostPath:
              path: /var/data/rethinkdb
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rethinkdb-master
      labels:
        app: rethinkdb-master
    spec:
      ports:
      - port: 28015
        name: rdb-api
      - port: 29015
        name: rdb-cluster-api
      selector:
        app: rethinkdb-master