이벤트 소싱을 이해하기 위해 도메인 주도 설계와 객체지향 설계 원칙(SOLID)을 연계해서 설명하는 책이다. 이어서 이벤트 소싱의 핵심인 도메인 이벤트, 재수화와 스냅샷, 프로젝션/CQRS 메커니즘이 동작하는 방식과 이벤트의 버전을 관리하는 방법을 배운다. 헥사고날 아키텍처와 함께 여러 서비스가 API와 이벤트로 협력하는 방식을 알아보고 이벤트 기반 마이크로서비스에서 사가(SAGA)와 보상 트랜잭션으로 데이터 일관성을 달성하는 방법을 이벤트 소싱을 적용했을 때와 그렇지 않은 경우를 배우고 사용자 인터페이스와 관계를 설명한다. 마지막으로 쿠버네티스 환경을 구축하고 서비스를 배포해본다.
Contents
1장. 도메인 주도 설계
1.1 도메인 로직 패턴
1.1.1 트랜잭션 스크립트 패턴
1.1.2 테이블 모듈 패턴
1.1.3 서비스 레이어 패턴
1.1.4 도메인 모델 패턴
1.2 헥사고날 아키텍처
1.3 도메인 주도 설계
1.3.1 유비쿼터스 언어
1.3.2 빌딩 블록
1.3.3 엔티티
1.3.4 값 객체
1.3.5 서비스
1.3.6 모듈
1.4 라이프사이클
1.4.1 애그리게이트
1.4.2 애그리게이트와 단위 테스트
1.4.3 애그리게이트 설계 규칙
1.4.4 팩토리
1.4.5 리포지토리
1.5 추상화된 핵심
1.6 요약
2장. 객체지향 설계 원칙
2.1 책임 주도 설계
2.2 단일 책임 원칙
2.3 개방/폐쇄 원칙
2.4 리스코프 치환 원칙
2.5 인터페이스 분리 원칙
2.6 의존성 역전 원칙
2.7 모듈
2.8 요약
3장. 이벤트 소싱 I
3.1 부서 이동
3.2 감사와 이력
3.2.1 단일 테이블과 시퀀스
3.2.2 상태 테이블과 이력 테이블 분리
3.2.3 변경 값
3.3 도메인 이벤트
3.4 이벤트 소싱
3.5 이벤트 소싱 구현
3.5.1 데이터 모델
3.5.2 애그리게이트와 이벤트 저장
3.5.3 커맨드와 이벤트
3.5.4 커맨드와 유효성 검사
3.5.5 재수화(이벤트 리플레이)
3.6 마이크로서비스 모듈
3.7 이벤트 소싱과 단위 테스트
3.8 요약
4장. 이벤트 소싱 II
4.1 도메인 객체 라이프사이클
4.1.1 애그리게이트 생성
4.1.2 애그리게이트 삭제
4.2 동시성과 이벤트 충돌
4.3 재수화 성능과 스냅샷
4.3.1 스냅샷 생성
4.3.2 재수화 제외 이벤트
4.4 스냅샷 생성 전략
4.4.1 주기적인 시간
4.4.2 매 N번째 이벤트
4.4.3 도메인 이벤트
4.5 이벤트 소싱과 상수
4.6 도메인 이벤트와 버전
4.6.1 업캐스팅
4.6.2 업캐스터
4.6.3 중간 이벤트
4.6.4 이벤트 마이그레이션
4.6.5 이벤트 버전과 스냅샷
4.7 마이크로서비스 모듈
4.8 다건 처리(반복문)와 성능
4.8.1 병렬 처리
4.8.2 캐싱
4.9 데이터 마이그레이션
4.10 백업과 아카이빙
4.11 이벤스 소싱과 추상화된 핵심
4.11.1 EventSourcedAggregate
4.11.2 Command
4.11.3 AggregateStore
4.12 요약
5장. 마이크로서비스 협업
5.1 인바운드 어댑터와 RESTful API
5.1.1 HTTP 메소드
5.1.2 애그리게이트와 URL
5.1.3 커맨드와 RESTful API
5.1.4 조회와 RESTful API
5.1.5 전역 예외 처리
5.1.6 마이크로서비스 모듈
5.2 아웃바운드 어댑터와 RESTful API
5.3 이벤트 브로커
5.3.1 도커와 카프카
5.4 아웃바운드 어댑터와 이벤트 발행
5.4.1 이벤트 발행
5.4.2 이벤트 브로커와 메시지
5.4.3 변환(2차) 메시지(커맨드/이벤트)
5.4.4 서비스 내부 이벤트와 외부 발행 이벤트
5.5 인바운드 어댑터와 이벤트 소비
5.6 이벤트 어댑터와 마이크로서비스 모듈
5.7 이벤트 어댑터와 추상화된 핵심
5.7.1 어노테이션
5.8 레거시 통합
5.8.1 피드
5.8.2 웹훅
5.8.3 그래프 큐엘
5.9 요약
6장. 결과적 일관성
6.1 기업 통합 패턴
6.1.1 라우팅 슬립 패턴
6.1.2 프로세스 매니저 패턴
6.2 분산 트랜잭션
6.3 사가
6.3.1 상관 관계 아이디
6.3.2 오케이스레이션
6.3.3 코레오그래피
6.3.4 타임아웃
6.3.5 의미적 잠금
6.4 계좌 이체
6.4.1 오케스트레이션
6.4.2 코레오그래피
6.5 이벤트 소싱과 결과적 일관성
6.5.1 이벤트 소싱과 사가
6.5.2 의미적 잠금
6.5.3 결과적 일관성
6.5.4 타임아웃
6.5.5 상관 관계 아이디와 추적성
6.6 사례 연구
6.6.1 카트와 관심 상품
6.6.2 주문과 재고
6.6.3 결제와 결제 실패
6.7 전통적인 이력관리와 결과적 일관성
6.8 도메인 이벤트와 라이브러리
6.9 일관성과 마이크로서비스 분리 및 통합
6.10 요약
7장. 명령과 조회 책임 분리(CQRS)
7.1 명령과 조회 책임 분리
7.2 구체화된 뷰와 이벤트 핸들러
7.2.1 상품 판매량 뷰
7.2.2 상담사 일일 총 통화시간 뷰
7.3 뷰 조회
7.4 CQRS와 RESTful API
7.5 뷰 복원
7.6 마이크로서비스 모듈
7.7 CQRS 활용 사례
7.7.1 선택적 동기화 - 코드
7.7.2 이벤트 통합 저장소 - 감사
7.7.3 값 누적 - 실시간 매출 현황
7.7.4 복잡한 계산 - 설계사 수수료
7.7.5 데이터 동기화 - 카트와 상품 판매가격 변경
7.8 이벤트 소싱과 뷰 일관성
7.9 요약
8장. 사용자 인터페이스
8.1 CRUD 사용자 인터페이스
8.2 태스크 기반 사용자 인터페이스
8.3 사용자 인터페이스와 커맨드
8.3.1 복합 커맨드
8.3.2 목록과 상세
8.4 페이지와 컴포넌트 구성
8.5 사용자 인터페이스와 비동기 서비스
8.5.1 화면 비활성화 후 새로고침
8.5.2 확인(완료) 화면
8.5.3 예상 결과 표시
8.5.4 이벤트와 푸시
8.5.5 타이머와 폴링
8.6 스벨트와 비트
8.6.1 스벨트 프로젝트 생성
8.6.2 서버 설정
8.6.3 svelte-navigator 의존성
8.7 계좌 이체와 계좌 페이지
8.8 비동기 구현
8.8.1 폴링과 setInterval 함수
8.8.2 푸시와 웹소켓
8.9 마이크로 프론트엔드
8.9.1 단일 페이지 애플리케이션과 컴포넌트
8.9.2 컴포넌트와 이벤트 프로그래밍
8.9.3 컴포넌트 vs
8.9.4 Assets output 경로
8.10 마이크로서비스와 형상 관리
8.11 요약
9장. 클라우드 환경
9.1 도커
9.1.1 도커 테스크탑 다운로드 및 설치
9.1.2 도커 리소스 설정
9.1.3 Dockerfile
9.1.4 이미지 생성
9.1.5 도커 허브에 이미지 푸시
9.2 쿠버네티스
9.2.1 쿠버네티스 설치
9.3 쿠버네티스 구성 요소
9.3.1 네임스페이스
9.3.2 파드
9.3.3 컨피그맵
9.3.4 시크릿
9.3.5 서비스
9.3.6 엔드포인트
9.3.7 디플로이먼트와 레플리카셋
9.3.8 디플로이먼트와 시크릿
9.4 이스티오
9.4.1 이스티오 설치
9.4.2 네임스페이스 생성
9.4.3 사이드카 설정
9.4.4 게이트웨이
9.4.5 버추얼 서비스
9.5 프로메테우스와 그라파나
9.5.1 프로메테우스와 그라파나 설치
9.5.2 이스티오 게이트웨이
9.5.3 마이크로미터
9.6 키알리
9.6.1 키알리 설치
9.6.2 키알리와 서비스 의존성
9.7 요약
Author
손경덕
웹 스크래핑 기반 서비스 회사에서 개발자로 시작한 후 보험 관련 SI 회사를 거쳐 현재는 넥스트리에서 근무하고 있습니다. 2018년 아키텍처 컨설팅을 시작으로 모든 시스템을 마이크로서비스 아키텍처로 구축하면서 다양한 상황에서 해결책을 찾고 있습니다. 최근에는 멀티-테넌트 아키텍처에서 역할 및 권한 관리와 마이크로 프론트엔드의 효율적인 구현/배포 방법을 고민하고 있습니다.
웹 스크래핑 기반 서비스 회사에서 개발자로 시작한 후 보험 관련 SI 회사를 거쳐 현재는 넥스트리에서 근무하고 있습니다. 2018년 아키텍처 컨설팅을 시작으로 모든 시스템을 마이크로서비스 아키텍처로 구축하면서 다양한 상황에서 해결책을 찾고 있습니다. 최근에는 멀티-테넌트 아키텍처에서 역할 및 권한 관리와 마이크로 프론트엔드의 효율적인 구현/배포 방법을 고민하고 있습니다.