9. 도메인 모델과 경계
- 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 안됨
- ex1) 재고 관리, 주문, 배송에서 의미하는 상품 도메인의 의미가 모두 다름
- ex2) 시스템을 사용하는 도메인에서는 회원, 주문에서는 주문자, 배송에서는 보내는 사람
- 특정한 문맥 하에서 서로 다른 의미를 가질 수 있으므로 하위 도메인마다 모델을 만들어야 하며 이러한 경계를 바운디드 컨텍스트(Bounded Context)라 부름
바운디드 컨텍스트
- 바운디드 컨텍스트는 모델의 경계를 결정

- 한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 가짐
- 한 바운디드 컨텍스트는 실제로 사용자에게 기능을 제공하는 물리적 시스템

- 규모가 작은 기업은 전체 시스템을 하나의 팀에서 구현할 때도 있음
- 이럴 때 여러 하위 도메인을 하나의 바운디드 컨텍스트 안에서 구현해야 하는데 이떄 하위 도메인이 섞이지 않도록 해야함
- 하위 도메인마다 구분되는 패키지를 갖도록 하여 바운디드 컨텍스트를 만들어야 함

- 회원의 Member와 주문의 Orderer (애그리거트 루트, 밸류)
- 각각 다른 엔티티는 아니고 주문 바운디드 컨텍스트에서 값만 VO(Value Object)로 사용
- 카탈로그와 재고 바운디드 컨텍스트 (둘다 애그리거트)
- 카탈로그와 재고 바운디드 컨텍스트 각각에서 엔티티를 정의
바운디드 컨텍스트 구현

- 바운디드 컨텍스트에서는 표현, 응용, 인프라 및 테이블 스키마까지 포함됨
- 바운디드 컨텍스트마다 정해진 구현 방법은 없고 서로 다른 아키텍처, 구현 기술를 사용할 수 있음
바운디드 컨텍스트 간 통합
직접적인 바운디드 컨텍스트 통합
- 상품 추천 기능이 추가 된다 하면 추천 바운디드 컨텍스트가 새로 생김
- 상품 추천 기능 도메인 서비스는 인프라 영역에 위치
- 받아온 데이터를 현재 도메인의 Product 모델로 변환하는 작업 등도 수행
간접적인 바운디드 컨텍스트 통합
- 메시지 큐 사용
- 사용자가 조회한 상품 이력 등을 메시지 큐로 전달
MSA와 바운디드 컨텍스트
- MSA는 개별 서비스를 독립된 프로세스로 실행하고 각 서비스가 REST API나 메시징을 통해 통신하는 구조
- 바운디드 컨텍스트와 잘 어울림 - 바운디드 컨텍스트를 MSA로 구현하면 자연스럽게 컨텍스트 별로 모델이 분리됨
바운디드 컨텍스트 간 관계
- 가장 흔한 바운디드 컨텍스트 연결 방식은 API 제공 및 호출
- API 제공 측에 의존하게 됨
- 그래서 두 팀이 서로 개발 계획을 공유하고 일정을 협의해야 함

- 여기서 RecSystemClient는 외부 시스템의 도메인이 침범하지 않도록 막아주는 역할
- 해당 부분이 모델 변환을 처리해주기 때문에 다른 바운디드 컨텍스트의 모델에 영향을 받지 않고 내 도메인 모델을 유지할 수 있음
공유 커널
- 두 바운디드 컨텍스트가 같은 공유하는 모델을 가질 때 이를 공유 커널이라 함
- 중복을 줄일 수 있지만, 한 팀에서 임의로 모델을 변경해서는 안되며, 두 팀이 밀접한 관계를 유지해야 함
독립 방식
- 서로 통합하지 않음. 독립적으로 모델 발전
- 한 시스템이 변경되면 수동으로 바운디드 컨텍스트 수정 및 통합
- 이는 한계가 있으므로 규모가 커지기 시작하면 두 바운디드 컨텍스트를 통합해야 함
- 그럴 수 없다면 두 바운디드 컨텍스트를 통합해주는 별도 시스템을 만들어야 함
컨텍스트 맵

- 전체 비즈니스를 조망하기 위한 지도
- 각 바운디드 컨텍스트의 경계 및 어떤 관계를 맺고 있는지
- OHS(Open Host Service), ACL(Anti Corruption Layer) 표시
- 하위 도메인이나 조직 구조, 주요 애그리거트를 함께 표시하면 전체 관계 및 모델에 대한 이해에 도움이 됨