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

created : Thu, 22 Jul 2021 02:56:55 +0900
modified : Mon, 29 Nov 2021 03:00:30 +0900
ddd msa

1. 아마존 비지니스 민첩성의 비밀

1.1 성공한 인터넷 기업들과 비지니스 민첩성

1.2 마이크로서비스란 무엇인가?

모노리스와 마이크로서비스 비교

SOA와 마이크로서비스

1.3 마이크로서비스를 위한 조건은 무엇인가?

조직의 변화: 업무 기능 중심 팀

관리체계의 변화: 자율적인 분권 거버넌스, 폴리글랏

개발 생명주기의 변화: 프로젝트가 아니라 제품 중심으로

개발 환경의 변화: 인프라 자동화

저장소의 변화: 통합 저장소가 아닌 분권 데이터 관리

위기 대응 방식의 변화: 실패를 고려한 설계

1.4 정리

2. MSA의 이해

2.1 리액티브 선언: 현대 애플리케이션이 갖춰야 할 바람직한 속성들

2.2 결합에서 느슨한 결합의 아키텍처로의 변화

2.3 마이크로서비스의 외부 아키텍처와 내부 아키텍처

2.4 MSA 구성요소 및 MSA 패턴

2.4.1 인프라 구성요소

2.4.2 마이크로서비스 운영과 관리를 위한 플랫폼 패턴

2.4.3 애플리케이션 패턴

2.5 정리

3. 마이크로서비스 애플리케이션 아키텍처

3.1 비지니스 로직은 어디에? - 관심사의 분리

3.2 헥사고날 아키텍처와 클린 아키텍처

3.3 마이크로서비스의 내부 구조 정의

3.4 정리

4 마이크로서비스와 애자일 개발 프로세스

4.1 도메인 주도 설계와 마이크로서비스

4.2 기민한 설계/개발 프로세스

4.3 정리

5 마이크로서비스 설계

5.1 마이크로서비스를 도출하는 방법

5.2 DDD에서의 설계

5.3 DDD의 전략적 설계

5.4 이벤트 스토밍을 통한 마이크로서비스 도출

5.5 마이크로서비스 상세설계

5.6 도메인 모델링

5.7 정리

6. 사례 연구 - 마이크로서비스 도출과 아키텍처 구성

6.1 요구사항 정의

6.2 이벤트 스토밍을 통한 마이크로서비스 도출

  1. 왼쪽에서 오른쪽 방향으로 업무 처리 흐름별로 도메인 이벤트(오렌지색)를 모두 붙인다.
  2. 다음으로 이벤트와 대응되는 커맨드(파란색)를 도출해서 이벤트 오른쪽에 붙인다.
  3. 액터(작은 노란색)를 통해 도출될 이벤트와 커맨드를 검증하며 커맨드 왼쪽 아래에 붙인다.
  4. 이벤트와 연관된 외부 인터페이스(핑크색)를 식별한다.
  5. 그 다음에는 각 이벤트와 커맨드에 영향을 받는 데이터 요소인 애그리거트(노란색)를 찾는다.
  6. 마지막에는 이벤트 발생 시 타 영역의 커맨드를 트리거하는 정책(라이락색)을 도출한다.

6.2.2 바운디드 컨테스트 식별

6.2.3 컨텍스트 다이어그램

6.2.4 이벤트 스토밍 결과를 헥사고날 아키텍처로 표현하기

이벤트 스토밍헥사고날 아키텍처 구성요소
커맨드외부 영역의 인바운드 어댑터 - API 후보
이벤트외부 영역의 아웃바운드 어댑터로 전송되는 메시지 이벤트 후보
애그리거트내부 영역의 도메인 모델의 후보
인터페이스외부 영역의 아웃바운드 어댑터로 연결될 대외 인터페이스 후보
정책내부영역의 비지니스 로직 구현 규칙, 외부 영역의 아웃바운드 어댑터로 연결될 다른 서비스와의 방향을 결정하는데 도움이 됨

6.3 외부 아키텍처 정의

6.4 내부 아키텍처 정의

6.4.1 패키지 구조 및 명명 규칙

6.5 JHipster를 활용한 아키텍처 구성

JHipster로 개발 시작하기

  1. 게이트웨이 생성
  2. 레지스트리 생성
  3. 마이크로서비스 생성
  4. 생성한 마이크로서비스에 엔티티 생성
  5. 생성된 엔티티를 게이트웨이가 인식할 수 있도록 게이트웨이에 등록

7 사례연구 - 백엔드 마이크로서비스 구현

| API 명 | 도서 대출 | | 리소스 URI | /retnals/{userid}/rentedItem/{book} | | 메서드 | POST | | 요청 매개변수 | 사용자 인련번호, 도서 일련번호 | | 요청 예시 | http://localhost:8080/rentals/5/rentedItem/10001 | | 응답 결과 | 정상 처리 시 도서대출정보를 반환 - Rental 일련번호, 사용자 일련번호, 대출 가능 여부, 연체료 | | 응답 예시 | {"id": 1, "userId": 5, "retalStatus": "RENT_AVAILABLE", "lateFee": 0} |