주난v 개발 성장기

[DDD START!] 7장 도메인 서비스 본문

개발 성장기/DDD

[DDD START!] 7장 도메인 서비스

주난v 2020. 5. 29. 07:59

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

한 애그리거트로 기능을 구현할 수 없을 때가 있다.

(ex. 결제 금액 계산 로직...상품 / 주문 / 할인 쿠폰 / 회원 애그리거트를 모두 필요로 함)

 

주문 금액을 계싼하는 것은 주문 애그리거트에서 할 수 있지만, 실제 결제 금액은 누구의 책임일까..?

  • 주문 애그리거트가 필요 데이터를 모두 가지고, 주문 애그리거트에서 처리..?

    • 계산 로직이 주문 애그리거트에 있는 문제

    • 할인 건이 생겨도, 주문 쪽 코드를 수정해야 함

--> 애그리거트는 자신의 책임 범위를 넘어서는 기능을 구현, 의존성이 증가

 

도메인 서비스

한 애그리거트에 억지로 넣기보다 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러내면 된다.

 

public class DiscountCalculationService {
	public Money calculateDiscountAmounts(orderLines, coupons, grade) {
    	...
    }
}

public class Order {
	public void calculateAmounts(DiscountCalculationService disCalSvc) {
    	Money totalAmounts = getTotalAmounts();
        Money discountAmounts = disCalSvc.calculateDiscountAmounts();
    }
}

도메인 서비스 객체를 애그리거트에 주입하지 않기

애그리거트의 메서드를 실행할 때, 도메인 서비스 객체를 파라미터를 가지고 있다면...이는 애그리거트가 도메인 서비스에 의존하는 것

일부 기능을 위해 굳이 도메인 서비스 객체를 애그리거트에 의존 주입할 이유가 없다. (모든 기능에서 쓰이는 것도 아니고..)

--> 도메인 서비스가 실행될 때, 애그리거트를 전달하는 것이 낫다.

 

public class TransferService {
	public void transfer(Account fromAcc, Account toAcc, Money amounts) {
    	fromAcc.withdraw(amounts);
        toAcc.credit(amount);
    }
}

 

특정 기능이 응용 서비스인지 도메인 서비스인지 아는 법?

해당 로직이 애그리거트의 상태를 변경하거나 애그리거트의 상태 값을 계산하는 지 검사한다.

 

계좌 이체 - 애그리거트의 상태 변경

결제 금액 - 애그리거트의 주문 금액을 계산

--> 도메인 서비스

 

도메인 로직을 외부 시스템이나 별도 엔진을 이용해서 구현할 경우 인터페이스와 클래스 분리(도메인 - 인프라스트럭쳐)