도메인 영역의 코드를 작성하다 보면, 한 애그리거트로 기능을 구현할 수 없을 때가 있다.
이렇게 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안 된다. !
이런 문제를 해소하는 가장 쉬운 방법은 도메인 기능을 별도 서비스
로 구현 하는것!
도메인 서비스를 사용하는 경우
도메인 영역 = 애그리거트 + 밸류 + 도메인 서비스 + 리포지토리 인터페이스 + …
도메인 서비스는 애그리거트
나 밸류
와 다르게 상태 없이 로직만 구현한다.
도메인 서비스를 사용하는 주체는
애그리거트가 될 수도 있고
!!!
public class Member{
private Password password;
public void encodePassword(PasswordEncoder passwordEncoder){
password = passwordEncoder.encode(password);
}
}
응용 서비스가 될 수도 있다.
public class TransferService {
public void transfer(Acount fromAcc, Account toAcc, Money amounts){
freomAcc.withdraw(amounts);
toAcc.credit(amounts);
}
}
트랜잭션 처리는 도메인 서비스에서 하는 것이 아니다.
도메인 서비스
는 도메인 영역
이다!
계산 로직같은 경우 도메인 서비스는 굳이 인터페이스로 만들지 않아도 되지만 변경이 예상되거나 팀의 룰에 따라 인터페이스를 둘 수도 있다.
하지만 외부 시스템을 이용하는 경우는 꼭 도메인 영역에 인터페이스를 두고 구현체를 infrastructure 영역에 두자