개념이 제대로 잡히지 않은 것 같아 정리해보려고 한다.
Bounded Context (바운디드 컨텍스트)
- 하나의 도메인 모델이 일관성 있게 적용되는 논리적 경계
- 서로 다른 팀이 각자의 컨텍스트에서 같은 용어를 다르게 정의할 수 있음
e.g) 주문, 청구, 결제, 인증 등은 각각 독립된 Bounded Context일 수 있음
모델과 언어의 일관성이 보장되는 경계임
Ubiquitous Language (유비쿼터스 언어)
- 개발자와 비즈니스 담당자가 공통으로 사용하는 용어 체계
- 코드, 설계 문서, 회의에서 동일한 언어로 소통하는 것이 목적
- 도메인 전문가와 협업하여 도출한, 명확하고 일관된 용어를 코드와 설계에 반영
바운디드 컨텍스트 안에서 유비쿼터스 언어로 일관된 용어로 정의
A(주문 도메인)은 "주문(Order)"을 고객이 상품을 선택하고 결제를 완료하는 행위로 정의할 수 있고,
B(청구 도메인)은 "주문(Order)"을 고객에게 청구서가 발행되는 시점 혹은 청구 단위로 정의할 수 있다
Aggregate (어그리게잇)
- 도메인의 일관성을 보장하는 객체의 집합
- 한 Aggregate은 하나의 Aggregate Root를 가짐
- 단순 묶음이 아니라, 불변성과 트랜잭션의 경계를 관리하는 단위
Aggregate Root (어그리게잇 루트)
- Aggregate 외부에서 유일하게 접근 가능한 루트 객체
- 외부는 반드시 루트를 통해서만 Aggregate 내부를 조작해야 함
e.g) Order는 루트, OrderItem은 내부 객체
Entity (엔티티)
- 고유한 식별자(ID)를 가지며, 상태 변화를 가질 수 있는 도메인 객체
e.g) Order, Payment, User
Value Object (값 객체, VO)
- 식별자가 없고, 값 자체로 비교됨
- 불변성을 가짐
- 예: Money, Address, DateRange
- 의미 있는 개념을 가진 불변 객체
Domain Event (도메인 이벤트)
- 도메인 내에서 발생한 과거형 사건을 표현
- 예: OrderShipped, PaymentCompleted
- 시스템 간 통신에도 사용 가능
- 발생한 사실을 표현하는 객체
Repository (리포지토리)
- Aggregate Root 단위로 도메인 객체의 영속성을 추상화
e.g) OrderRepository.findById(orderId)
Application Layer
- 유스케이스 조합, 트랜잭션 관리, 흐름 제어 담당
- 도메인 모델 orchestrate
- 비즈니스 로직은 여기서 작성하지 않음 → 도메인 계층에 위임
e.g : OrderPlaceUseCase.execute();
Domain Layer
- 핵심 비즈니스 규칙과 도메인 모델 정의
- 엔티티, 값 객체, 도메인 서비스, 도메인 이벤트 포함
Infrastructure Layer
- 외부 자원 연동 (DB, 파일, 메일, 외부 API 등)
- Repository 구현체, API 클라이언트, 메시지 큐 등 포함
Management
- 복잡한 내부 도메인 로직 캡슐화
- 도메인 규칙 기반의 명령 처리(Command Handling) 담당
- 여러 Aggregate 조작, 상태 변경, 도메인 이벤트 발행, 로그 등
- 도메인 서비스 또는 애플리케이션 서비스 내에서 책임 분리용 컴포넌트로도 활용
Provider
- Aggregate Root 기준으로 조회에 필요한 데이터 가공 및 조합
상황별 사용
상황 | 사용하는 것 | 이유 |
---|
복잡한 상태 변경, 도메인 규칙 다수 | Management | 도메인 캡슐화, 도메인 서비스 성격 분리 |
어그리게잇 루트 조회 | Provider | Aggregate Root, 내부 VO, Entity 조회 |
비즈니스/화면 요구 기준 | QueryService | 응답 중심 읽기 모델 제공 |
단순 CRUD | Repository 직접 사용 | UseCase 레벨에서 단순 위임 처리 가능 |
Provider vs QueryService
항목 | Provider | QueryService |
---|
위치 | Application Layer 내부 (UseCase 안) | Application Layer 바깥 또는 API Layer |
기준 | Aggregate Root 중심 | 비즈니스/화면 요구 기준 |
조회 범위 | Aggregate + 연관된 VO/Entity 정도 | 여러 도메인 넘나드는 복합 조회 가능 |
리턴 값 | Aggregate, VO, 내부 전용 DTO | Response DTO, ViewModel, Projection |
목적 | 도메인 규칙에 맞는 조회 조합 | 응답 중심 읽기 모델 제공 |
사용하는 곳 | UseCase 내에서만 호출 | Controller에서 직접 호출 가능 |