도메인 주도 설계로 시작하는 마이크로서비스 개발

핵심 개념과 패턴, 설계, 구현으로 배우는 DDD와 MSA

넷플릭스, 우버, 아마존, 쿠팡 등의 대규모 인터넷 서비스를 제공하는 회사들의 애플리케이션은 어떤 구조로 만들어졌을까? 가상화되고 유연하게 변경되는 클라우드 인프라에 최적화된 애플리케이션 형태는 무엇일까?

이러한 질문의 해답이 되는 애플리케이션 형태가 바로 마이크로서비스이며, 마이크로서비스는 클라우드 환경에서 가장 진화된 애플리케이션 형태다.

이 책은 마이크로서비스 개발에 입문하고자 하는 분들을 위해 전반적인 마이크로서비스 아키텍처의 개념과 주요 패턴들을 소개하고 마이크로서비스 개발 방법으로 가장 주목받는 도메인 주도 설계를 살펴본다. 특히 도메인 주도 설계의 업무 분석 및 설계 기법인 이벤트 스토밍을 통해 업무를 빠르게 분석하고 마이크로서비스를 도출 및 설계하는 방법을 소개한다.

이 책은 초심자도 쉽게 이해할 수 있게 마이크로서비스의 전반적인 개념을 설명한 후 실제 마이크로서비스 개발을 위한 아키텍처 정의, 마이크로서비스 도출, 도메인 모델 설계, 구현, 빌드 및 배포와 같은 마이크로서비스 개발 활동들을 단계별로 알아본다.

★ 이 책에서 다루는 내용 ★

  • 마이크로서비스의 주요 개념과 마이크로서비스 아키텍처 패턴
  • JHipster를 이용한 마이크로서비스 아키텍처 구현
  • 이벤트 스토밍 기법을 활용한 마이크로서비스 도출
  • 도메인 모델 중심의 마이크로서비스 내부 설계
  • 카프카를 활용한 이벤트 기반 마이크로서비스 개발과 클라우드 환경 배포

 

도서 상세 이미지

한정헌

어느덧 21년차 개발자. 인터넷 서비스 업체를 시작으로 동양시스템즈에 근무했고, 2006년부터 SK(주) C&C에 15년째 근무 중이다. 다양한 SI 프로젝트를 경험했으며 개발방법론/설계 전문가로 다수의 대규모 프로젝트 설계 과정을 리딩했다. 애자일 프랙티스, 애플리케이션 설계에 관심이 많으며 최근에는 클라우드 기반의 애플리케이션 개발, 도메인 주도 설계 확산 활동을 하고 있다. 우리가 살아가는 세상이 지금보다 좀 더 나아지기를 바라며 개발자로써 그에 기여하고자 한다. 천성적인 게으름에도 불구하고 KMOOC 강좌, 사외 전문가 멘토링 활동, 대학 강의 등의 활동을 병행하고 있다.

유해식

대학에서 컴퓨터공학과를 전공하고, 첫 직장인 도담시스템스에서 군용 항공기 시뮬레이터를 개발했다. 2011년 SK(주) C&C로 이직해서 클라우드 기반의 애플리케이션 개발방법론을 정립하고 클라우드 기반 MSA 프로젝트의 설계/개발 기술지원 업무를 수행하고 있다. 올해는 프로젝트 인큐베이션 업무를 수행하고 있으며, 이 활동을 통해 개발이 행복한 회사를 만드는 것이 목표다. 외부 활동으로는 2018년에 K-MOOC에서 온라인 강좌를 개발하는 것을 시작으로, 사외 ICT 멘토링, 그룹 내 MSA 분야에서 마스터로 활동하고 있다.

최은정

SI와 SM의 경계에서 자바 기반의 백엔드 개발을 해왔다. 최근에는 MSA 애플리케이션 개발 지원 업무를 수행하고 있다. 언제나 새로운 분야에 열린 마음을 가진 IT 엔지니어가 되고자 한다

이주영

현재 SK(주) C&C에 개발자로 입사하여 MSA 시스템의 개발 지원 업무를 수행하고 있다. 프런트엔드와 백엔드 개발을 넘나드는 풀스택 개발자가 되기 위해 자바, Vue.js, 타입스크립트 등 다양한 언어와 프레임워크를 공부하고 실제 프로젝트에 적용해서 개발하고 있다. 언제나 초심을 잃지 않고 어제보다 나은 오늘이 되기 위해 열심히 살아가는 것이 목표다.

  • ▣ 01장: 아마존 비즈니스 민첩성의 비밀
    • 1.1 성공한 인터넷 기업들과 비즈니스 민첩성
      • 1.1.1 성공 사례: 아마존의 배포 속도
      • 1.1.2 클라우드 인프라의 등장
      • 1.1.3 클라우드 인프라에 어울리는 애플리케이션의 조건
        • 스케일 업과 스케일 아웃
        • 특정 서비스만 탄력성 있게 확장(스케일 아웃)
        • 클라우드 프렌들리와 클라우드 네이티브
    • 1.2 마이크로서비스란 무엇인가?
      • 1.2.1 모노리스와 마이크로서비스 비교
      • 1.2.2 SOA와 마이크로서비스
    • 1.3 마이크로서비스를 위한 조건은 무엇인가?
      • 1.3.1 조직의 변화: 업무 기능 중심 팀
      • 1.3.2 관리체계의 변화: 자율적인 분권 거버넌스, 폴리글랏
      • 1.3.3 개발 생명주기의 변화: 프로젝트가 아니라 제품 중심으로
      • 1.3.4 개발 환경의 변화: 인프라 자동화
      • 1.3.5 저장소의 변화: 통합 저장소가 아닌 분권 데이터 관리
      • 1.3.6 위기 대응 방식의 변화: 실패를 고려한 설계
    • 1.4 정리
    •  
  • ▣ 02장: MSA의 이해
    • 2.1 리액티브 선언: 현대 애플리케이션이 갖춰야 할 바람직한 속성들
    • 2.2 강 결합에서 느슨한 결합의 아키텍처로의 변화
    • 2.3 마이크로서비스의 외부 아키텍처와 내부 아키텍처
    • 2.4 MSA 구성요소 및 MSA 패턴
      • 2.4.1 인프라 구성요소
        • 퍼블릭 클라우드와 베어 메탈, 프라이빗 클라우드 환경
        • VM과 컨테이너
        • 컨테이너 오케스트레이션
        • 그 밖의 다양한 클라우드 인프라 서비스
      • 2.4.2 마이크로서비스 운영과 관리를 위한 플랫폼 패턴
        • 개발 지원 환경: 데브옵스 인프라 구성
        • 빌드/배포 파이프라인 설계
        • 마이크로서비스 생태계와 운영 관리 요소의 탄생
        • 경험으로 획득한 지혜: 마이크로서비스 관리/운영 패턴
        • 스프링 클라우드: 스프링 부트 + 넷플릭스 OSS
        • 다양한 서비스의 등록 및 탐색을 위한 서비스 레지스트리, 서비스 디스커버리 패턴
        • 서비스 단일 진입을 위한 API 게이트웨이 패턴
        • BFF 패턴
        • 외부 구성 저장소 패턴
        • 인증/인가 패턴
        • 장애 및 실패 처리를 위한 서킷 브레이커 패턴
        • 모니터링과 추적 패턴
        • 중앙화된 로그 집계 패턴
        • MSA 기술 변화 흐름
        • 서비스 메시 패턴
      • 2.4.3 애플리케이션 패턴
        • UI 컴포지트 패턴 또는 마이크로 프런트엔드
        • 마이크로서비스 통신 패턴
        • 저장소 분리 패턴
        • 분산 트랜잭션 처리 패턴
        • 읽기와 쓰기 분리: CQRS 패턴
        • API 조합과 CQRS
        • 쓰기 최적화: 이벤트 소싱 패턴
    • 2.5 정리
    •  
  • ▣ 03장: 마이크로서비스 애플리케이션 아키텍처
    • 3.1 비즈니스 로직은 어디에? - 관심사의 분리
      • 3.1.1 데이터베이스 중심 아키텍처의 문제점
    • 3.2 헥사고날 아키텍처와 클린 아키텍처
      • 3.2.1 레이어드 아키텍처
      • 3.2.2 헥사고날 아키텍처
      • 3.2.3 클린 아키텍처
    • 3.3 마이크로서비스의 내부 구조 정의
      • 3.3.1 바람직한 마이크로서비스의 내부 아키텍처: 클린 마이크로서비스
      • 3.3.2 내부 영역 – 업무 규칙
        • 트랜잭션 스크립트 패턴
        • 도메인 모델 패턴
        • 도메인 주도 설계의 애그리거트 패턴
      • 3.3.3 외부 영역 - 세부사항
        • API 퍼블리싱 어댑터
        • API 프락시 어댑터
        • 저장소 처리 어댑터
        • 도메인 이벤트 발행 어댑터
        • 도메인 이벤트 핸들러
    • 3.4 정리
    •  
  • ▣ 04장: 마이크로서비스와 애자일 개발 프로세스
    • 4.1 도메인 주도 설계와 마이크로서비스
    • 4.2 기민한 설계/개발 프로세스
      • 4.2.1 점진/반복적인 스크럼 생명주기
      • 4.2.2 아키텍처 정의와 마이크로서비스 도출
      • 4.2.3 스프린트 내 개발 공정
    • 4.3 정리
    •  
  • ▣ 05장: 마이크로서비스 설계
    • 5.1 마이크로서비스를 도출하는 방법
      • 5.1.1 비즈니스 능력에 근거한 도출
      • 5.1.2 DDD의 바운디드 컨텍스트 기반 도출
    • 5.2 DDD에서의 설계
    • 5.3 DDD의 전략적 설계
      • 5.3.1 도메인과 서브도메인
      • 5.3.2 유비쿼터스 언어와 도메인 모델, 바운디드 컨텍스트
      • 5.3.3 컨텍스트 매핑
        • 주요 컨텍스트 매핑 관계
        • 컨텍스트 맵
    • 5.4 이벤트 스토밍을 통한 마이크로서비스 도출
      • 5.4.1 이벤트 스토밍 워크숍 준비
      • 5.4.2 이벤트 스토밍 워크숍 진행
    • 5.5 마이크로서비스 상세설계
      • 5.5.1 프런트엔드 모델링
      • 5.5.2 백엔드 모델링
        • API 설계
    • 5.6 도메인 모델링
      • 5.6.1 DDD의 전술적 설계(도메인 모델링 구성요소)
        • 엔티티
        • 값 객체
        • 표준 타입
        • 애그리거트
        • 도메인 서비스
        • 도메인 이벤트
    • 5.7 정리
    •  
  • ▣ 06장: 사례 연구 – 마이크로서비스 도출과 아키텍처 구성
    • 6.1 요구사항 정의
    • 6.2 이벤트 스토밍을 통한 마이크로서비스 도출
      • 6.2.1 이벤트 스트밍 워크숍
      • 6.2.2 바운디드 컨텍스트 식별
      • 6.2.3 컨텍스트 다이어그램
      • 6.2.4 이벤트 스토밍 결과를 헥사고날 아키텍처로 표현하기
    • 6.3 외부 아키텍처 정의
    • 6.4 내부 아키텍처 정의
      • 6.4.1 패키지 구조 및 명명 규칙
    • 6.5 JHipster를 활용한 아키텍처 구성
      • 6.5.1 MSA 외부 아키텍처 구성(게이트웨이, 레지스트리 서비스)
      • 6.5.2 마이크로서비스 빠르게 만들어 보기
      • 6.5.3 백엔드 서비스의 프로젝트 구조 리팩터링
    • 6.6 정리
    •  
  • ▣ 07장: 사례연구– 백엔드 마이크로서비스 구현
    • 7.1 도서 대출 마이크로서비스 개발
      • 7.1.1 구현 기능 소개
      • 7.1.2 내부 아키텍처 결정
      • 7.1.3 API 설계
      • 7.1.4 도메인 모델링
      • 7.1.5 유스케이스 흐름
      • 7.1.6 내부 영역 – 도메인 모델 개발(도서 대출, 반납)
      • 7.1.7 내부 영역 - 서비스 개발
      • 7.1.8 내부 영역 - 리포지토리 개발
      • 7.1.9 외부 영역 – REST 컨트롤러 개발
      • 7.1.10 외부 영역 – 아웃바운드 어댑터 개발(동기 호출)
        • 타 서비스에 대한 동기 호출: 페인 클라이언트 연결
        • EnableFeignClients 처리
      • 7.1.11 외부 영역 – 아웃바운드 어댑터 개발(비동기 호출 EDA 구현)
        • 타 서비스에 대한 비동기 호출 처리: 카프카를 이용한 EDA 구현
        • 대출 서비스에 카프카 Producer 만들기
        • 도메인 이벤트 객체 - StockChanged.java
        • 도서 마이크로서비스에 컨슈머(Consumer) 어댑터 구현하기
      • 7.1.12 내부 영역 – 도메인 모델 개발: 도서 연체 및 연체된 도서 반납
        • 서비스 흐름 처리
      • 7.1.13 내부 영역 – 도메인 모델 개발: 대출 불가 해제 처리 기능 구현
      • 7.1.14 외부 영역 – REST 컨트롤러 개발
    • 7.2 사용자 마이크로서비스 개발
      • 7.2.1 사용자 마이크로서비스의 기능 소개
      • 7.2.2 API 설계
      • 7.2.3 도메인 모델링
      • 7.2.4 유스케이스 흐름
      • 7.2.5 내부 영역 - 도메인 모델 개발
      • 7.2.6 내부 영역 - 서비스 개발
      • 7.2.7 내부 영역 - 리포지토리 개발
      • 7.2.8 외부 영역 - REST 컨트롤러 개발
      • 7.2.9 외부 영역 - 아웃바운드 어댑터 개발
    • 7.3 사용자 마이크로서비스 - 포인트 관리 기능 구현
      • 7.3.1 기본 포인트 부여 기능 구현
      • 7.3.2 포인트 적립/결제 기능 구현
        • User 엔티티의 포인트 적립 메서드 - User.java
        • User 엔티티의 포인트 결제 메서드 – User.java
    • 7.3.3 포인트 적립, 결제 기능에 대한 호출 구현
    • 7.4 정리
    •  
  • ▣ 08장: CQRS 패턴을 활용한 백엔드 마이크로서비스 개발
    • 8.1 도서 마이크로서비스 개발
      • 8.1.1 구현 기능 소개
      • 8.1.2 내부 아키텍처 결정
      • 8.1.3 API 설계
      • 8.1.4 도메인 모델링
      • 8.1.5 입고 도서 등록과 재고 도서 등록에 대한 유스케이스 흐름
      • 8.1.6 내부 영역 - 도메인 모델 개발
      • 8.1.7 내부 영역 - 서비스 개발
      • 8.1.8 내부 영역 - 리포지토리 개발
      • 8.1.9 외부 영역 - REST 컨트롤러 개발
      • 8.1.10 외부 영역 - 아웃바운드 어댑터 개발
      • 8.1.11 외부 영역 - 인바운드 어댑터 개발
    • 8.2 도서 카탈로그 마이크로서비스
      • 8.2.1 기능 소개
      • 8.2.2 내부 아키텍처 결정
      • 8.2.3 API 설계
      • 8.2.4 도메인 모델링
      • 8.2.5 내부 영역 - 도메인 모델 개발
      • 8.2.6 내부 영역 - 서비스 개발
      • 8.2.7 내부 영역 - 리포지토리 개발
      • 8.2.8 외부 영역 - REST 컨트롤러 개발
      • 8.2.9 외부 영역 - 인바운드 어댑터 개발
    • 8.3 정리
    •  
  • ▣ 09장: 사례 연구 – 시연 수행
    • 9.1 서비스 동작 환경 실행
    • 9.2 게이트웨이와 마이크로서비스 동작시키기
    • 9.3 웹 화면에서 시나리오 테스트하기
    • 9.4 정리
    •  
  • ▣ 10장: 애플리케이션 통합과 배포
    • 10.1 통합 및 배포 파이프라인 정의
      • 10.1.1 지속적 통합
      • 10.1.2 지속적 배포
    • 10.2 GCP 배포 환경 구성
      • 10.2.1 GCP 환경설정
      • 10.2.2 GKE 생성
    • 10.3 JHipster를 이용한 애플리케이션 배포
      • 10.3.1 지속적 통합
      • 10.3.2 지속적 배포
    • 10.4 정리
  • 20쪽, 본문 6번째 줄

    예전의 시스템 아키텍처는 결함이나 실패 무결성을 추구했다.

    ==>

    예전의 시스템 아키텍처는 무결함이나 실패 무결성을 추구했다.