일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Template Method Pattern
- spring
- 자바의 신
- CQRS
- Java 8 in action
- Java8 in action
- spring boot
- AWS101
- facade pattern
- ddd
- spring Batch
- head first
- web
- 디자인 패턴
- Clean Code
- 자바
- Stream
- 패스트캠퍼스
- Java in action
- Design Pattern
- Was
- domain
- 자바8
- Java
- jsp
- SERVLET
- 자바8인액션
- Java8
- 스트림
- 클린코드
Archives
- Today
- Total
주난v 개발 성장기
[DDD START!] 7장 도메인 서비스 본문
여러 애그리거트가 필요한 기능
한 애그리거트로 기능을 구현할 수 없을 때가 있다.
(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);
}
}
특정 기능이 응용 서비스인지 도메인 서비스인지 아는 법?
해당 로직이 애그리거트의 상태를 변경하거나 애그리거트의 상태 값을 계산하는 지 검사한다.
계좌 이체 - 애그리거트의 상태 변경
결제 금액 - 애그리거트의 주문 금액을 계산
--> 도메인 서비스
도메인 로직을 외부 시스템이나 별도 엔진을 이용해서 구현할 경우 인터페이스와 클래스 분리(도메인 - 인프라스트럭쳐)
'개발 성장기 > DDD' 카테고리의 다른 글
[DDD START!] 9장. 도메인 모델과 BOUNDED CONTEXT (0) | 2020.06.08 |
---|---|
[DDD START!] 8장. 애그리거트 트랜잭션 관리 (1) | 2020.06.02 |
[DDD START!] 6장. 응용 서비스와 표현 영역 (1) | 2020.05.26 |
[DDD START!] 5장. 리포지터리의 조회 기능 (0) | 2020.05.22 |
[DDD START!] 4장. 리포지터리와 모델 구현 (0) | 2020.05.19 |