❐ Description
도메인 주도 설계(에릭 에반스) 14장 내용 중 Bounded Context를 읽고 요약한 글이다.
❐ Bounded Context
1. Bounded Context란?
Bounded Context는 규모가 큰 프로젝트에서 여러 개의 도메인이 공존할 때 각 도메인의 경계를
명확히 구분하는 개념이다.
2. 왜 Bounded Context가 필요한가?
- 규모가 큰 프로젝트에서는 여러 개의 모델이 존재하며, 팀마다 다르게 해석할 여지가 있다.
- 동일한 시스템을 개발하는 팀이 서로 다른 모델을 적용하면 혼란이 발생할 수 있다.
- 명확한 경계를 정의하지 않으면, 팀 간 모델 차리를 빠르게 인지하기 어렵다.
- 결과적으로 예상치 못한 시스템 오류가 발생할 가능성이 높다.
3. 바운디드 컨텍스트의 핵심 개념
- 모델의 경계를 명확히 정의
- 특정 팀이 사용하는 모델과 다른 팀이 사용하는 모델을 구분한다.
- 컨텍스트 내에서 일관성 유지
- 컨텍스트 내부에서는 모델이 논리적으로 통합된 상태여야 한다.
- 컨텍스트 내부에서는 일관된 규칙이 적용되어야 한다.
- 예를 들어, 웹에서 주문한 경우 주문 상태는 (접수 > 결제 완료 > 배송 중) 인데
- 어드민에서 주문 상태를 (접수 > 배송중)으로 변경할 수 있는 경우
- 다른 컨텍스트와는 느슨한 결합
- 다른 컨텍스트와 직접적인 모델 공유를 피하고, 필요한 경우 번역(Translation) 과정을 거친다.
- Ubiquitous Language
- 각 컨텍스트에서 사용하는 용어와 개념을 명확히 정의하여 혼선을 방지한다.
4. Bounded Context vs. Module
- 모듈(Module)은 하나의 도메인 모델 내에서 요소들을 나누어 관리하는 개념이다.
- Bounded Context는 서로 다른 도메인을 구분하고, 독립적인 경계를 정의하는 개념이다.
- 따라서 하나의 바운디드 컨텍스트 안에 여러 개의 모듈이 포함될 수 있지만,
여러 컨텍스트를 포함하는 단일 모듈을 만들면 모델 간 충돌이 발생할 가능성이 크다.
5. Bounded Context를 정의하는 것의 이점
- 명확한 책임 분리
- 각 팀은 자신들이 관리하는 모델과 그 경계를 정확히 이해할 수 있다.
- 자유로운 개발 방식 허용
- 컨텍스트 내부에서는 팀이 원하는 방식으로 모델을 설계할 수 있다.
- 비공식적인 정보 공유 방지
- 필요하지 않은 정보 공유를 줄여, 예상치 못한 오류를 방지할 수 있다.
- 예를 들어, 주문 시스템에서 재고 시스템의 데이터베이스를 직접 조회하는 경우
- 이렇게 되면 주문 시스템은 재고 관리 시스템의 내부 데이터 구조를 알고 있어야 한다.
- 따라서, 재고 시스템은 API를 제공하여, 주문 시스템이 이를 통해 재고를 조회하도록 강제한다.
- 조직적 혼란 최소화
- 프로젝트 진행 중 모델 간의 불일치로 인해 발생하는 혼선을 줄일 수 있다
6. Bounded Context 간의 관계
- 경계의 중요성
- 바운디드 컨텍스트(Bounded Context)는 독립적이지만, 다른 컨텍스트와 연결될 수밖에 없다.
- Context Map
- 여러 컨텍스트 간의 관계를 시작적으로 표현해 각 컨텍스트가 차지하는 영역과 연결 방식을 정의한다.
- Continuous Integration
- 특정 바운디드 컨텍스트 내부에서 모델의 일관성을 유지하기 위해 지속적인 통합 과정이 필요하다.
7. 모델간 충돌 유형
- 중복된 개념
- 같은 개념을 표현하는데 서로 다르게 모델링한 경우.
- 예를 들어, 하나의 개념(예: 결제)이 서로 다른 팀에서 조금씩 다르게 구현되면,
같은 정보를 변경할 때마다 두 군데를 모두 수정해야 하는 문제가 발생한다. - 새로운 인사이트가 생겨 모델을 수정할 때, 개념을 다시 분석하고 정리해야 한다.
- 최악의 경우, 같은 개념이지만 데이터가 다르게 저장되는 모델이 공존할 수도 있다.
- 허위 동족 언어 (Homonyms)
- 같은 용어를 사용하지만, 실제 의미나 구현이 다를 때 발생.
- 예를 들어 "Charge"라는 단어가 한 팀에서는 청구(요금 부과)라는 의미로,
다른 팀에서는 충전(배터리 충전)이라는 의미로 사용될 경우 - 이런 상황이 발생하면, 서로 다른 의미의 코드가 합쳐지고, 데이터베이스에서 불일치가 발생하며,
팀 내 커뮤니케이션이 엉망이 될 수 있다.
8. 균열을 해결하는 방법
- 균열을 감지했을 때 결정을 내려야 한다.
'Architecture > DDD' 카테고리의 다른 글
7. 언어의 사용 (확장 예제) (0) | 2025.03.05 |
---|---|
6-3. Repository (0) | 2024.12.06 |
6-2. Factory (0) | 2024.12.03 |
ReadMe.md (0) | 2024.12.03 |