Index
- 여러 애그리거트가 필요한 기능
- 도메인 서비스
- 계산 로직과 도메인 서비스
- 외부 시스템 연동과 도메인 서비스
- 도메인 서비스의 패키지 위치
- 도메인 서비스의 인터페이스와 클래스
여러 애그리거트가 필요한 기능
- 여러 애그리거트가 필요한 기능이 있을 때 특정 도메인에 로직을 몰아넣게 되면 다음과 같은 문제점이 발생한다.
- 코드가 길어지고 외부 의존도가 높아진다.
- 애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어 명시적으로 드러나지 않는다.
- 이 경우 도메인 기능을 별도의 서비스로 구현하는 방법이 있다.
위로
도메인 서비스
- 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다. 주로 다음과 같은 상황에 사용한다.
- 계산 로직 : 여러 애그리거트가 필요한 계산 로직이거나 한 애그리거트에 넣기는 다소 복잡한 계산 로직
- 외부 시스템 연동이 필요한 도메인 로직 : 구현하기 위해 타 시스템을 사용해야하는 도메인 로직
계산 로직과 도메인 서비스
- 도메인 서비스를 별도로 구현해 도메인 개념을 명시적으로 드러내면 된다.
- 응용 서비스는 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다루는 서비스라 이해하면 된다.
- 응용 서비스는 애그리거트 객체에 도메인 서비스를 전달한다.
- 도메인 서비스는 도메인 로직을 처리하지 응용 로직을 처리하지 않는다.
- 트랜잭션 처리는 응용 서비스 책임이므로 별도로 구현하지 않는다.
외부 시스템 연동과 도메인 서비스
- 외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있다.
- 외부 시스템의 경우 HTTP API 호출로 이뤄지지만 필요한 외부 시스템에 대한 로직도 하나의 도메인 로직으로 볼 수 있기 때문이다.
- 외부 시스템 호출 시 HTTP 외에 다른 방법으로도 호출할 수 있기 때문에 인터페이스를 만들고 구현체를 인프라스트럭쳐 영역에 위치시킨다.
도메인 서비스의 패키지 위치
- 도메인 서비스는 도메인 로직을 표현하므로 도메인이 위치한 패키지에 같이 위치시킨다.
- 도메인 서비스의 개수가 많거나 엔티티, 밸류와 같은 다른 구성요소들과 명시적으로 구분하고 싶다면
domain
패키지 밑에 domain.model
, domain.service
, domain.repository
와 같이 하위 패키지를 구분해도 좋다.
도메인 서비스의 인터페이스와 클래스
- 도메인 서비스의 로직이 고정되어 있지 않은 경우 인터페이스로 추출할 수 있다.
- 즉, 도메인 서비스의 구현이 특정 기술에 의존하거나 외부 시스템 API를 실행한다면 도메인 영역의 도메인 서비스는 인터페이스로 추상화해야한다.
- 이를 통해 도메인 영역이 특정 구현에 종속되는 것을 막고 도메인 영역에 대한 테스트가 쉬워진다.
위로