DDD 도메인주도설계

도메인주도설계 7장

MIN우 2024. 2. 4. 15:04
728x90

도메인 서비스는 도메인 로직을 수행하지 응용 로직을 수행하진 않는다. 트랜잭션 처리와 같은로직은 응용로직이므로 도메인 서비스가 아닌  응용서비스에서 처리해야 한다.

 

특정 기능이 응용서비스인지 도메인 서비스인지 감을 잡기 어려울 때는 해당 로직이 애그리거트의 상태를 변경하거나 애그리거트의 상태 값을 계산하는지 검사해봐야한다. 예를 들어 계좌 이체 로직은 계좌 어그리거트의 상태를 변경하고 결제금액 로직은 주문 애그리거트의 주문금액을 계산한다. 두 로직은 각각 애그리거트를 변경하고 애그리거트의 값을 계산하는 도메인로직이다. 도메인 로직이면서 한 애그리거트에 넣기에 적합하지않으므로 이 두 로직은 도메인 서비스로 구현하게된다.

 

즉, 두개의 어그리거트의 상태값을 변경하는 것은 하나의 도메인로직에 넣기가 적합하지않으므로 이 두 로직은 도메인서비스에서 처리하는 것이 더 좋겠다.

 

 

 

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

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

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

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

 

도메인 서비스

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

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

 

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

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

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

 

다음과 같은 구조로 설계를 하면 될 것 같다.

 

 

 

 

 

 

 

 

728x90