-한 도메인은 여러 하위 도메인으로 구분된다. 때문에 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다.
카탈로그에서 상품(상품 정보 위주)
≠ 재고 관리 상품(실존하는 개별 객체를 추적하는 용도)
ex) 시스템을 사용하는 사람
회원 도메인 → 회원, 주문 도메인 → 주문자, 배송 도메인 → 보내는 사람
이렇듯 하위 도메인마다 같은 용어라도 의미가 다르고 같은 대상이라도 지칭하는 용어가 다를 수 있음
때문에 한 개의 모델로 모든 하위 도메인을 표현하려는 시도는 올바른 방법이 아니며 표현할 수 없음
여러 하위 도메인의 모델이 섞이면 모델의 의미가 약해질 뿐만 아니라 여러 도메인의 모델이 서로 얽히기 때문에 각 하위 도메인별로 다르게 발전하는 요구사항을 모델에 반영하기 어려워짐
--> 따라서 모델은 특정 컨텍스트 하에서 완전한 의미를 가진다. 이러한 컨텍스트를 바운디드 컨텍스트
라고 부름
모델의 경계를 결정하며 한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 가짐
바운디드 컨텍스트는 각자 구현하는 하위 도메인에 맞는 모델을 갖음
-> 하위 도메인(1) : 바운디드 컨텍스트(1)
이렇게 구상하는것이 이상적이지만 현실은 팀 조직 구조에 따라 결정
실제로 사용자에게 기능을 제공하는 물리적 시스템 도메인 모델은 이 바운디드 컨텍스트 안에서 도메인을 구현
한 개의 바운디드 컨텍스트에 여러 하위 도메인이 포함되는 경우, 하위 도메인마다 구분되는 패키지를 갖도록 구현하여 하위 도메인의 모델이 섞이지 않도록 함
- 단일 모델로 만들면 확장이 어려워자고 서비스 경쟁력을 떨어트림
모든 바운디드 컨텍스트를 반드시 DDD로 개발할 필요는 없음
온라인 쇼핑 사이트에서 매출 증대를 위해 카탈로그 하위 도메인에 개인하 추천 기능을 도입하기로 했다고 가정했을 때, 카탈로그 하위 도메인에는 기존 카탈로그를 위한 바운디드 컨텍스트와 추천 기능을 위한 바운디드 컨텍스트가 생김
public interface ProductRecommendationService {
List<Product> getRecommendationOf(ProductId id);
}
상류 컴포넌트
하류 컴포넌트
공유 커널
독립 방식