도메인 주도 설계(DDD, Domain-Driven Design)는 복잡한 소프트웨어 시스템을 설계하고 개발하는 데 있어 도메인(즉, 문제의 영역)에 집중하는 방법론입니다. DDD는 비즈니스 도메인의 개념과 규칙을 소프트웨어 모델에 직접 반영하여 시스템의 구조와 작동 방식을 도메인 전문가와 개발자가 공통으로 이해할 수 있도록 하는 것을 목표로 합니다.
DDD의 핵심 개념
- 도메인(Domain): 소프트웨어가 해결하려고 하는 문제의 영역입니다. 예를 들어, 전자상거래 시스템에서 도메인은 "전자상거래"입니다.
- 도메인 모델(Domain Model): 도메인 내의 개념과 관계를 설명하는 추상화된 모델입니다. 이는 엔티티, 값 객체, 서비스 등으로 구성됩니다.
- 유비쿼터스 언어(Ubiquitous Language): 개발자와 도메인 전문가가 모두 이해할 수 있는 공통의 언어입니다. 이 언어를 사용하여 도메인 모델을 정의하고, 소프트웨어와 커뮤니케이션합니다.
- 바운디드 컨텍스트(Bounded Context): 도메인 모델이 정의되고 일관성을 유지하는 논리적 경계입니다. 큰 시스템에서 여러 개의 바운디드 컨텍스트가 있을 수 있으며, 각 바운디드 컨텍스트 내에서만 유비쿼터스 언어가 정확하게 적용됩니다.
Aggregate와 Aggregate Root
Aggregate는 도메인 모델에서 관련된 여러 객체가 하나의 단위로 묶인 것을 의미합니다. Aggregate는 하나의 논리적 단위로 처리되어야 하며, 이를 통해 복잡한 비즈니스 규칙을 관리하고 일관성을 유지할 수 있습니다.
- Aggregate Root: Aggregate의 루트 엔티티로서, Aggregate 외부에서 접근할 수 있는 유일한 진입점입니다. 다른 객체는 Aggregate Root를 통해서만 접근 가능합니다. 이는 Aggregate 내의 모든 객체들이 일관된 상태를 유지할 수 있도록 하는 중요한 역할을 합니다. 예를 들어, 전자상거래 시스템에서 "주문(Order)"은 Aggregate이고, "주문" 내의 개별 항목(Item)들은 Aggregate의 일부이며, "주문" 객체가 Aggregate Root가 됩니다.
Aggregate Root의 주요 기능:
- 일관성 관리: Aggregate Root는 Aggregate 내의 모든 변경을 관리하며, 외부에서의 직접적인 접근을 차단합니다. 이는 도메인 규칙에 따라 Aggregate가 일관성을 유지하도록 합니다.
- ID 참조: 다른 Aggregate는 Aggregate Root의 ID만 참조할 수 있으며, 직접 다른 엔티티를 참조하지 않습니다.
- 변경의 단위: Aggregate Root는 하나의 트랜잭션 내에서만 변경됩니다. 이는 전체 Aggregate가 하나의 논리적 단위로서 변경되고, 이로 인해 불일치 상태가 발생하는 것을 방지합니다.
요약
도메인 주도 설계(DDD)는 복잡한 소프트웨어 시스템에서 도메인 모델을 중심으로 설계를 진행하는 방법론입니다. Aggregate는 관련된 객체들의 집합이며, Aggregate Root는 이 집합의 일관성을 유지하고 외부 접근을 조절하는 역할을 합니다. 이를 통해 시스템의 안정성과 유지보수성을 높일 수 있습니다.
예시
물론입니다! C#으로 작성된 코드를 Java로 변환해 드리겠습니다.
1. 도메인 엔티티(Entity)와 값 객체(Value Object)