[DDD-START] Ch07. Domain Service


공부하는 내용을 정리하는 목적으로 작성하고 있습니다. 잘못 작성된 내용을 지적해주시면 좀더깊이 공부해서 내용을 수정하겠습니다.

여러 애그리거트가 필요한 기능

한 애그리거트로 구현할 수 없는 기능이 있다.

결제 금액 계산 로직

  1. 상품 애그리거트 : 상품의 가격
  2. 주문 애그리거트 : 주문한 상품별 개수
  3. 할인쿠폰 애그리거트 : 조건에 따른 할인 쿠폰들
  4. 회원 애그리거트 : 회원 등급에 따른 할인율

주문 애그리거트를 통해 주문한 상품목록과 회원정보, 회원이 가지고 있는 쿠폰 등을 조회할 수 있지만 할인은 각 상품별로 다를 수 있기때문에 주문 애그리거트만으로는 결제금액을 확정지을 수 없다.

주문 애그리거트에 할인을 계산하기 위한 부가적인 애그리거트를 할당하는 방법은 좋지않다.
주문 애그리거트는 주문 기능을 수행해야 하는데 할인이라는 기능은 주문에 종속되지 않는다.
예를들어 할인쿠폰은 대부분 사용할 수 있는 기간이 정해져있고(기간이 지난 할인쿠폰은 주문 도메인에 있을 이유가 없다)
할인율도 그때그때 다를 수 있다. (할인율이 달라질때마다 주문정보가 변경될 순 없다.)
따라서 주문과 할인이라는 기능은 각각 맡은 책임이 다르므로 독립적으로 구성되야 한다.(상품과 리뷰같이?)

이렇게 여러 도메인을 사용해야 하는경우, 주체를 정하기 어려울 때 도메인 서비스를 구현한다. (응용 서비스가 아니다)

도메인서비스

응용서비스는 응용 로직을 다루고 도메인 서비스는 도메인 로직을 다룬다.(?)

  • 응용 로직 : 사용자가 요구하는 기능
  • 도메인 로직 : 하나의 책임을 갖는 단일 기능(?)

도메인 서비스를 구현할 때는 도메인의 의미가 드러나는 용어를 사용한다.
(ex. 할인금액계산 : DiscountCalculateService)

할인금액 계산을 수행을 위해 도메인 서비스(DiscountCalulateService)가 구현되었다면 이것은 응용 서비스(OrderService)에서 사용될 수 있다.
이 경우 아래와 같은 구조가 된다.

Alt text

결제금액 계산 로직

  1. 표현 영역은 사용자로부터 결제금액 계산 요청을 받는다.
  2. 응용 서비스는 총금액에서 할인금액을 빼야하므로 계산을 위해 주문 애그리거트로 할인금액 도메인서비스를 넘겨 할인금액을 요청한다.
    • 응용 서비스는 주문 도메인 외에 할인금액 도메인서비스를 갖고 있다.
  3. 주문 애그리거트는 도메인서비스를 통해 할인금액을 계산하고 총 주문금액에서 할인금액을 뺀 금액을 결제금액으로 확정 짓는다.
  4. 응용 서비스는 표현영역으로 계산된 총 결제금액을 전달한다.
  5. 표현영역은 사용자에게 결제금액을 전달한다.

주문 애그리거트에서 할인계산 도메인서비스를 의존받는 방법은 좋지 않다.
의존받게되면 굳이 불필요하게 응용서비스에서 주문 애그리거트로 도메인서비스를 넘기는 작업을 줄일 수 있지만 주문 애그리거트와 할인금액 도메인서비스 간 결합이 강해지는 문제가 잇다.
Spring을 포함 OOP의 장점을 살리기 위해서는 객체 간 의존을 줄여 결합율을 낮춰야 한다고 공부했다.

도메인 서비스와 응용 서비스의 구분

구현하려는 로직이 애그리거트의 상태를 변경하거나, 상태 값을 계산하는지 검사한다.
계좌이체 로직이 계좌 애그리거트를 변경하고, 결제금액 로직은 주문 애그리거트의 주문금액을 계산한다.
애그리거트의 상태를 변경/조회하는 주체는 도메인이다.
도메인이면서 한 애그리거트로 구현하기 어려운지 확인한다.
(계좌이체 로직은 입금계좌, 출금계좌의 애그리거트가 필요하고, 결제금액 로직은 주문, 상품, 할인, 회원 등 애그리거트가 필요하다.)
따라서 위의 두 로직은 도메인 서비스에 해당한다.

  • 응용서비스는 도메인의 상태를 변경하지 않는다. 도메인의 기능만 실행할 뿐이다. 도메인의 상태는 기능을 수행하는 도메인이 변경한다.

DDD-START (최범균님 저) 도서 참조






© 2020.09.23 by chpark

Powered by chpark