DDD 철저 입문 04. 부자연스러움을 해결하는 도메인서비스

강준혁·2022년 9월 22일
0

DDD 철저 입문

목록 보기
4/6
post-thumbnail

서비스란?

도메인 모델을 기반으로 만들어진 도메인 객체만으로 수행하기 어려운 책임이 있는 경우 '순수한 가공물'을 창조해내어 이 객체에 해당 책임을 부여할 수 있다.

서비스는 이러한 '순수한 가공물'의 한 종류라고 볼 수 있으며 어플리케이션 서비스와 도메인 서비스 두가지로 분류된다.

도메인 서비스란?

시스템에서 값 객체 또는 엔티티로 구현하기 어색한 행동들을 해결해주는 객체를 도메인 서비스라고 한다.

const user = new User();
const isDuplicated = user.isExists(user);

위와 같이 유저의 존재 여부를 그 객체 스스로에게 묻는 것은 부자연스럽다.

문맥상으로도 어색할 뿐만 아니라, 만약 존재 여부 확인을 위해 인프라 영역에 대한 접근이 필요할 경우 User 도메인 객체는 인프라 영역에 대한 책임까지 할당받게 되어 결합도가 추가되며 User 도메인 객체가 행하는 모든 행동에 인프라 영역에 대한 결합도가 필요한 것이 아니므로 응집도는 떨어진다.

이와 같은 경우 해당 책임을 도메인 서비스에 할당함으로서 위 문제를 해결할 수 있다.

const user = new User();
const isDuplicated = userService.isExists(user);

도메인 서비스는 가능한 한 피할 것

도메인 서비스는 도메인 객체가 스스로 처리하기에 '부자연스러운 처리'에만 한정하여 사용되어야 한다.
도메인 객체가 원래 포함했어야 할 상태나 행동을 서비스에 위임하게되면 도메인 객체는 빈혈 객체가 되어 본래의 의미가 퇴색된다.

도메인 서비스의 기준

어떤 처리를 도메인 서비스로 만들어야 할지를 판단할 때 그 처리가 도메인에 기초한 것인지를 중요하게 보아야 한다.
'사용자명 중복' 이라는 개념이 도메인에 기초한 것이라면 구현하는 서비스도 도메인서비스어야 한다.
반대로 애플리케이션을 만들며 필요하게 된 것이라면 도메인 서비스가 아닌 애플리케이션 서비스로 정의되어야 한다.

profile
백엔드 개발자

0개의 댓글