도메인 서비스

2023. 8. 18. 07:56스터디/DDD 스터디

728x90

구현을 하다보면 한 애그리거트에 넣기 애매한 도메인 기능이 있다.

그러한 기능들을 억지로 특정 에그리거트에 넣으면 안 된다.

자신의 책임 범위를 넘어서서 기능을 구현하면 코드가 길어지고 외부에 대한 의존이 높아지기 때문이다.

도메인 기능을 별도 서비스로 구현하면 이러한 문제를 해결할 수 있다.

 

도메인 서비스

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

- 계산 로직 : 여러 에그리거트가 필요한 계산 로직, 한 애그리거트에 넣기 다소 복잡한 계산 로직

- 외부 시스템 연동일 필요한 로직 : 구현하기 위해서 타 시스템을 사용해야 하는 도메인 로직

 

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

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

 

도메인 서비스를 사용하는 주체는 에그리거트가 될 수 있고, 응용 서비스가 될 수 있다.

에그리거트에서 사용한다면, 도메인 서비스를 전달하는 것은 응용 서비스의 책임이다.

 

도메인 서비스는 도메인 로직을 수행하지 응용 로직을 수행하지 않는다.

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

 

### 응용 서비스와 도메인 서비스 구별법

해당 로직이 애그리거트의 상태를 변경하거나, 상태 값을 검사한다 : 도메인 로직

else : 응용 서비스 : 표현 영역과 도메인 영역을 연결해주는 창구, 인프라 영역과 연결, 트렌잭션 관리

 

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

외부 시스템이나 타 도메인과 연동 기능도 도메인 서비스가 될 수 있음.

도메인 서비스의 구현이 특정 구현 기술에 의존하거나 외부 시스템의 API를 실행한다면 도메인 서비스는 인터페이스로 추상화해야

 

궁금한 사항 : 그럼 Repository를 사용하는 것도 애그리거트 내에서 진행해야 하지 않나?(트랜젝션 때문인가?)

Repository도 외부 시스템에 대한 연동 아닌가

 

728x90