도메인 기능을 별도 서비스로 구현하면 해결도메인 사용하는 상황
할인 금액처럼 한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러내면 된다.
애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다.응용 서비스의 책임이다.public class Order {
public void calculateAmounts(
DiscountCalculationService disCalSvc, MemberGrade grade) {
Money totalAmounts = getTotalAmounts();
Money discountAmounts =
disCalSvc.calculateDiscountAmounts(this.orderl_ines, this.coupons, grade);
}도메인 서비스는 도메인 로직을 수행하지 응용 로직을 수행하진 않는다.
public class Transferservice {
public void transfer(Account fromAcc, Account toAcc, Money amounts) {
fromAcc.withdraw(amounts);
toAcc.credit(amounts);
}
...
트랜잭션 처리와 같은 로직은 응용 서비스에서 처리해야 한다.외부 시스템 연동과 도메인 서비스
예시 > 설문 조사 시스템
- 사용자가 생성 권한을 가진 역할인지 확인하기 위해 역할 관리 시스템과 연동
- 설문 조사 도메인 로직 관점에서 인터페이스를 작성 → 역할 관리 시스템과 연동한다는 관점으로는 작성하지 않았다.

도메인 서비스의 개수가 많거나 엔티티나 밸류와 같은 다른 구성요소와 명시적으로 구분하고 싶다면 domain 패키지 밑에 domain.model, domain.service, domain.repository와 같이 하위 패키지를 구분하여 위치시켜도 된다.
도메인 서비스의 구현이 특정 구현 기술에 의존하거나 외부 시스템 API를 실행한다면 인터페이스로 추상화
