DDD의 중요개념 중 하나인 바운디드 컨텍스트는 비즈니스에서 동일한 단어가 가리키는 대상이 여럿이 될 때 비로소 필요한 개념이다. 마틴 파울러의 블로그에 그 맥락이 잘 드러나 있다.
다시말해 하나의 단어가 가리키는 대상이 자명히 하나라면 필요가 없는 개념이 바운디드 컨텍스트라는 사실을 배울 수 있다. 처음에 본인들도 “전사적으로 단 하나의(1개의 단어가 유일한 의미를 가지는) 모델을 만들어라”라고 권장하다가, 풀고자 하는 문제가 광범위해질수록 그 방식이 효율적이지 않음을 깨달았다고 한다. 대부분의 경우 나는 하나의 단어가 의미하는 대상에 미묘한 다의성(polysemy)가 없는 경우를 모델링하며, 심지어 혼자 개발한다. 프로젝트가 풀고자 하는 문제가 충분히 커지고 복잡해진 경우 바운디드 컨텍스트 개념을 떠올려도 늦지 않다.
자 이제 하나의 바운디드 컨텍스트에서 개발을 하다가, 점점 프로젝트가 커지는 상황을 생각해 보자. 각 컨텍스트 내에서 같은 이름의 개념(예: "Customer")이 서로 다른 의미를 가져도 충돌 없이 발전시킬 수 있어야 한다.
src/
├── domain/
├── application/
└── infrastructure/
README.md
프로젝트 스캐폴드에 이 개념이 고스란히 반영된다. 처음에는 단일 컨텍스트로 시작했더라도, 도메인이 복잡해지면서 서로 다른 의미를 가진 개념들이 등장할 때 스캐폴드에서도 가장 바깥쪽 경계를 만드는 방식으로 자연스럽게 확장된다.
src/
├── user-management/ # 사용자 관리 바운디드 컨텍스트
│ ├── domain/
│ ├── application/
│ └── infrastructure/
├── order-processing/ # 주문 처리 바운디드 컨텍스트
│ ├── domain/
│ ├── application/
│ └── infrastructure/
├── inventory/ # 재고 관리 바운디드 컨텍스트
│ ├── domain/
│ ├── application/
│ └── infrastructure/
└── shared/ # 공통 모듈: 여러 컨텍스트에서 공통으로 사용되는 도메인 개념은 shared_kernel 모듈에 배치하여 코드 중복을 방지하기도 함(<https://github.com/qu3vipon/python-ddd>)
README.md
user-management/ # 독립된 서비스
order-processing/ # 독립된 서비스
inventory/ # 독립된 서비스
shared-libraries/ # 공통 라이브러리
이렇게 하면 각각의 바운디드 컨텍스트 및 유비쿼터스 언어가 독립된 팀에 의해 관리되어야 한다는 원칙도 지키기 쉬워지고, 각각을 MSA(마이크로서비스 아키텍처) 등의 아키텍처로 분리해 확장하기도 쉬우며, 독립적으로 배포하고 버전 관리하기도 좋다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
None