본문 바로가기
Back-End/도메인 주도 개발 시작하기

[DDD] 도메인 주도 개발 시작하기 Ch9

by SoyeonCha 2024. 4. 8.

Chapter 9 도메인 모델과 바운디드 컨텍스트

 9.1 도메인 모델과 경계

한 개의 모델로 여러 하위 도메인을 모두 표현하려 하면 안 됨

   ex. 재고 관리에서의 상품, 주문에서의 상품, 배송에서의 상품에서 상품은 다 다른 의미를 가짐

하위 도메인마다 사용하는 용어가 다르기 때문에 올바른 도메인 모델을 개발하려면 하위 도메인마다 모델을 만들어야 함

Bounded Context : 모델이 완전한 의미를 갖는 경계가 있는 컨텍스트

 

9.2 바운디드 컨텍스트

바운디드 컨텍스트는 모델의 경계를 결정함

한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 가짐

바운디드 컨텍스트는 실제로 사용자에게 기능을 제공하는 물리적 시스템

여러 하위 도메인을 한 개의 바운디드 컨텍스트에서 개발할 때는 하위 도메인을 모델이 섞이지 않도록 주의

모델이 섞이지 않도록 하위 도메인마다 구분되는 패키지를 갖도록 구현해야 함

 

9.3 바운디드 컨텍스트 구현

바운디드 컨텍스트는 표현 영역, 응용 서비스, 도메인, 인프라스트럭처 영역, DB를 모두 포함함

모든 바운디드 컨텍스트를 반드시 도메인 주도로 개발할 필요는 없음

한 바운디드 컨텍스트 안에서 다른 구현 방식(ex. 도메인 모델 기반, 서비스-DAO)을 사용할 수 있음

바운디드 컨텍스트는 UI를 가지고 있지 않을 수도 있음

각 바운디드 컨텍스트는 UI 서버를 이용해서 간적적으로 브라우저와 통신할 수도 있음

 

9.4 바운디드 컨텍스트 간 통합

하위 도메인에 두 개 이상의 팀이 영향을 준다면 바운디드 컨텍스트 간 통합이 발생함

도메인 서비스를 구현한 클래스는 인프라스트럭처 영역에 위치하고, 외부 시스템과의 연동을 처리하고 외부 시스템의 모델과 도메인 모델 간의 변환을 처리함

모델 간의 변환 과정이 복잡하면 별도로 변환 역할을 맡는 클래스를 만듦

REST API 호출은 두 바운디드 컨텍스트를 직접 통합하는 방법

큐 사용 등은 두 바운디드 컨텍스트를 간접적으로 통합하는 방법

어떤 도메인 관점에서 모델을 사용하느냐에 따라 두 바운디드 컨텍스트의 구현 코드가 달라짐

큐로 통합할 대 큐를 어떤 시스템이 제공하는지에 따라 데이터 구조가 달라짐

 

9.5 바운디드 컨텍스트 간 관계

두 바운디드 컨텍스트 간 관계 중에서 가장 흔한 관계는 한쪽에서 API를 제공하고 다른 한쪽에서 그 API를 호출하는 관계. REST API가 여기에 속함.

하류 컴포넌트는 상류 컴포넌트가 제공하는 데이터와 기능에 의존

상류 컴포넌트가 제공하는 REST API의 인터페이스가 바뀌면 하류 컴포넌트에 해당하는 시스템의 코드도 바뀜

상류 컴포넌트 : 서비스 공급자 역할

하류 컴포넌트: 상류 컴포넌트가 제공하는 서비스를 사용하는 고객 역할

상류 컴포넌트는 하류 컴포넌트가 사용할 수 있는 통신 프로토콜을 정의하고 공개함

공개 호스트 서비스 : 여러 개의 하류 컴포넌트의 요구를 수용할 수 있는, 서비스 형태의 공개된 API

   ex. 검색

상류 컴포넌트의 서비스는 상류 바운디드 컨텍스트의 도메인 모델을 따르기 때문에 하류 컴포넌트를 상류 서비스 모델의 영향으로부터 보호할 수 있는 완충 지대 필요

안티코럽션 계층 : 두 바운디드 컨텍스트 간의 모델 변환을 해주는 계층

공유 커널 : 두 바운디드 컨텍스트가 공유하는 모델

  - 공유 커널은 밀접한 관계의 두 컨텍스트 사이에서 사용할 때 중복을 줄여준다는 장점을 가짐

독립 방식 : 두 바운디드 컨텍스트가 서로 통합하지 않는 방식

두 바운디드 컨텍스트 간의 통합이 수동으로 이루어짐

대규모일 때 수동으로 통합하기에는 어려움

 

9.6 컨텍스트 맵

컨텍스트 맵 : 전체 비즈니스를 조망할 수 있는 지도. 바운디드 컨텍스트 간의 관계를 표시. 시스템의 전체 구조.

바운디드 컨텍스트 영역에 주요 애그리거트를 함께 표시하면 모델에 대한 관계가 더 명확히 드러남

바운디드 컨텍스트가 적절한 도메인에 두고, 집중해야 할 컨텍스트를 파악하는 데에 도움을 줌