algoqna

[DDD] 도메인 영역의 주요 구성 요소 본문

DDD

[DDD] 도메인 영역의 주요 구성 요소

kkalgo 2024. 3. 7. 23:15

참고 :  도메인 주도 개발 시작하기 - 최범균 저자

 

도메인 영역을 구성하는 요소를 DDD의 관점에서 바라본다.

 

1. 엔티티(ENTITY)

고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 가진다. MySQL의 AutoIncrement를 이용하면, 엔티티들은 1, 2, 3 ....등의 각자의 고유 식별자를 가지는 것과 같다. 이들은 도메인 모델의 데이터를 포함하고, 해당 데이터와 관련된 기능을 함께 제공한다.

 

2. 밸류(VALUE)

고유의 식별자를 갖지 않는 객체로, 주로 개념적으로 하나의 값을 표현할 때 사용한다. 금액의 표현은 int price로 할 수 있지만, 금액이라는 것을 더 명확하게 하고 싶다면 Money타입의 클래스로 대체하여 사용할 수 있다. 배송지 주소는 여러 가지의 필드를 가질 수 있다. 도로명, 세부 주소 등. 이들을 Address 타입으로 대체하여 사용할 수 있다.

 

3. 애그리거트(AGGREGATE)

연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다. 주문과 관련된 엔티티 Order와, 주소를 가지는 Address 밸류, 기타 다른 밸류 객체.. 등은 '주문' 애그리거트로 묶을 수 있다.

 

4. 리포지터리(REPOSITORY)

도메인 모델의 영속성을 처리.

 

5. 도메인 서비스(DOMAIN SERVICE)

특정 엔티티에 속하지 않은 도메인 로직을 제공한다. '할인 정책'은 사용자의 등급, 쿠폰, 금액에 따른 조건 등 하나로 구현되지 않고 여러 엔티티와 밸류를 필요로 할 수 있다. 즉 여러 엔티티와 밸류를 필요로 하게 되면 도메인 서비스에서 로직으로 구현하게 된다.

 

 

애그리거트를 중점으로

애그리거트는 관련 객체(엔티티, 밸류)를 하나로 묶은 것이라 하였다. 주문이란 도메인 개념은 여러 가지 하위 모델로 구성될 수 있는데, '배송지 정보', '주문자', '주문 목록', '결제 금액' 등이다. 이들을 개별 객체 간의 관계로 보지 않고, 애그리거트 간의 관계로 보아 큰 틀에서 도메인 모델을 관리하게 된다.

 

애그리거트는 루트 엔티티를 가진다. 쉽게 말해, 주문 애그리거트의 루트는 Order이다. Order를 사용하는 코드들은 Order가 제공하는 기능을 사용하고, Order를 통해서 간접적으로 애그리거트 내의 다른 엔티티나 밸류 겍체에 접근한다. 이렇게 함으로써 항상 Order를 통하게 되며, Order가 구현한 도메인 로직을 따르게 된다.