DDD 개념 정리

DragonTiger·2일 전
0
개념이 제대로 잡히지 않은 것 같아 정리해보려고 한다.

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도메인 캡슐화, 도메인 서비스 성격 분리
어그리게잇 루트 조회ProviderAggregate Root, 내부 VO, Entity 조회
비즈니스/화면 요구 기준QueryService응답 중심 읽기 모델 제공
단순 CRUDRepository 직접 사용UseCase 레벨에서 단순 위임 처리 가능

Provider vs QueryService

항목ProviderQueryService
위치Application Layer 내부 (UseCase 안)Application Layer 바깥 또는 API Layer
기준Aggregate Root 중심비즈니스/화면 요구 기준
조회 범위Aggregate + 연관된 VO/Entity 정도여러 도메인 넘나드는 복합 조회 가능
리턴 값Aggregate, VO, 내부 전용 DTOResponse DTO, ViewModel, Projection
목적도메인 규칙에 맞는 조회 조합응답 중심 읽기 모델 제공
사용하는 곳UseCase 내에서만 호출Controller에서 직접 호출 가능
profile
take the bull by the horns

0개의 댓글