소프트웨어 구조를 기술이 아니라 해결하려는 업무 영역(도메인)의 개념을 중심으로 짜는 설계 접근. 에릭 에반스(Eric Evans)가 2003년 같은 이름의 책에서 정리했다. 코드의 구조와 언어가 업무의 구조와 언어를 닮게 만드는 것이 목표다.
핵심 개념
- 유비쿼터스 언어(Ubiquitous Language): 개발자와 업무 담당자가 문서·회의·코드에서 같은 용어를 쓴다. 회의에서 "결제 승인"이라 부르면 코드에도
approvePayment()가 있다 - 엔티티(Entity): 식별자로 같음을 판단하고 상태가 바뀌는 객체(주문, 계정)
- 값 객체(Value Object): 식별자 없이 값으로 같음을 판단하는 불변 객체(금액, 주소)
- 애그리거트(Aggregate): 함께 일관성을 지켜야 하는 객체 묶음과 그 입구가 되는 루트
- 리포지터리(Repository): 애그리거트를 저장하고 꺼내는 창구. 저장 기술을 도메인에서 감춘다(Spring Data 리포지터리와 쿼리 메서드)
- 도메인 서비스(Domain Service): 특정 엔티티에 넣기 어려운 업무 로직(환율 계산, 여러 애그리거트에 걸친 규칙)
- 바운디드 컨텍스트(Bounded Context): 한 모델과 용어가 일관된 의미를 갖는 경계
폴더 구조로 보면
기술 레이어별(controllers, services, repositories)이 아니라 도메인별(order, payment, delivery)로 묶는다. 프런트엔드의 기능 단위 구조와 비슷하다(변경하기 쉬운 프런트엔드 코드). 함께 바뀌는 코드를 모으니 응집도가 높아진다.
주의
개념이 많고 학습 비용이 크다. 업무 규칙이 단순한 서비스에는 과하다. 실무에서는 도메인별 폴더 구성과 유비쿼터스 언어처럼 가벼운 부분부터 취하는 경우가 많다. 무엇을 풀지 먼저 정의하는 문제 공간과 해결 공간 사고와 짝을 이룬다.
출처: DDD Resources 에릭 에반스