DDD START SERIES는 도메인 주도 개발 시작하기 책을 참고 하여 작성된 요약(?) 글 입니다.

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

한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안 된다.

억지로 구현할 경우 애그리거트 자신의 책임 범위를 넘어서는 기능을 구현한다.

때문에 코드가 길어지고 외부에 대한 의존이 높아지게 되며 코드를 복잡하게 만들어 수정을 어렵게 만든다.

게다가 애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어들어 명시적으로 드러나지 않게 된다.

이러한 문제를 해결하기 쉬운 해결 방법은 도메인 기능을 별도의 서비스로 만드는 것이다.

7.2 도메인 서비스

도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다.

주로 아래와 같은 경우에 도메인 서비스를 생성한다.

  • 계산 로직 - 여러 애그리거트가 필요한 계산 로직. 한 애그리거트에 넣기에 다소 복잡한 로직.
  • 외부 시스템 연동이 필요한 도메인 로직 - 구현하기 위해 타 시스템을 사용해야 하는 도메인 로직.

7.2.1 계산 로직과 도메인 서비스

한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기보다는 도메인 서 버스를 이용해 드메인 개념을 명시적으로 들어낸다.

응용 영역의 서비스가 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다룬다.

도메인 영역의 애그리거트나 벨류와 같은 구성요소와 도메인 서비스를 비교할 때 다른 점은 도메인 서비스는 상태 없이 로직만 구현한다는 점이다.

그렇기 때문에 서비스 구현에 필요한 상태는 다른 방법으로 전달받는다.

도메인 서비스는 도메인의 의미가 드러나는 용어를 타입과 메서드 이름으로 갖는다.

애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서버스 책임이다.

주의할 점은 도메인 서비스를 에그리거트에 주입해서는 안 된다.

주입한다는 건 곳 의존한다는 것을 의미하기 때문이다.

이는 프레임워크의 기능을 사용하고 싶은 개발자의 욕심을 채우는 것에 불과하다.

도메인 서비스는 도메인 로직을 수행하는 것이지 응용 로직을 수행하는 것이 아니다.

트랜잭션 처리 같은 로직은 응용 로직이므로 도메인 서비스가 아닌 응용 서비스에서 처리해야 한다.

7.2.2 외부 시스템 연동과 도메인 서비스

7.2.3 도메인 서비스의 패키지 위치

도메인 서비스의 개수가 많거나 엔티티나 밸류와 같은 다른 구성요소와 명시적으로 구분하고 싶다면 domain 패키지 밑에 model, service, repository 와 같은 하위 패키지를 구분하여 위치 시켜도 된다.

7.2.4 도메인 서비스의 인터페이스와 클래스

도메인 서비스의 로직이 고정되어 있지 않은 경우 도메인 서비스 자체를 인터페이스로 구현하고 이를 구현한 클래스를 둘 수도 있다.

특히 도메인 로직을 외부 시스템이나 별도 엔진을 이용해서 구현할 때 인터페이스와 클래스를 분리하게 된다.

dd

REFERENCE

itssobeauti 도메인 주도 개발 시작하기