CH07 도메인 서비스
도메인 서비스 필요 배경
DDD 세레나데 수업 자료에 정리된 것을 그대로 가져왔다. 시기적으로 최범균님 책이 더 먼저 나온 것 같다.
예시 : 결제 금액 계산 로직
상품 애그리거트: 구매하는 상품의 가격이 필요하다. 또한 상품에 따라 배송비가 추가되기도 한다.
주문 애그리거트: 상품별로 구매 개수가 필요하다.
할인 쿠폰 애그리거트: 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 할인 쿠폰을 조건에 따라 중복 사용할 수 있다거나 지정한 카테고리의 상품에만 적용할 수 있다는 제약 조건이 있다면 할인 계산이 복잡해진다.
회원 애그리거트: 회원 등급에 따라 추가 할인이 가능하다.
이 상황에서 실제 결제 금액을 계산해야 하는 주체는 어떤 애그리거트일까?
도메인 서비스란
한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기보다는 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러내면 된다.
응용 영역의 서비스가 용용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다룬다.
도메인 영역의 애그리거트나 밸류와 같은 다른 구성요소와 비교할 때 다른 점은 상태 없이 로직만 구현한다.
서비스를 사용하는 주체는 애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다.
애그리거트 메서드를 실행할 때 도메인 서비스를 인자로 전달하지 않고 반대로 도메인 서비스의 기능을 실행할 때 애그리거트를 전달하기도 한다.
특정 기능이 응용 서비스인지 도메인 서비스인지 감을 잡기 어려울 때는 해당 로직이 애그리거트의 상태를 변경하거나 애그리거트의 상태 값을 계산하는지 검사해 보면 된다.
하나의 애그리거트가 온전히 그것만을 이용해서 처리할 수 없는 기능을 소화하기 위해서 만드는 서비스다. 위 설명에도 나와있지만 이를 응용 영역에서 이미 여러 애그리거트가 조회된 상황에서 함수의 호출을 위해 사용할 수도 있고, 애그리거트의 메소드에 도메인 서비스를 파라미터로 넘겨줘서 애그리거트 내부에서 로직 처리를 하도록 사용시킬 수 있다. 이전에 살펴본 ~Validator 처럼 사용하는 것이다.
도메인 서비스 위치
도메인 서비스는 당연하 도메인 영역에 위치한다. 아래와 같이 DiscountCalculationService 라는 도메인 서비스는 Order 도메인의 도메인 영역에 속한다.
도메인 서비스의 인터페이스 필요여부
만약 해당 도메인 서비스의 로직이 특정 인프라스트럭처에 종속된 코드가 나와야 한다면 DIP를 적용해서 실제 구현은 인프라스트럭처 영역에서 처리하는 것이 좋다. 이유는 DIP 의 장점에서 이미 다뤘다.
Last updated