DDD 도메인 주도 설계 철저 입문 리뷰(6)

유스케이스를 구현하기 위한 ‘애플리케이션’ 서비스

Junyoung
4 min readJul 15, 2023

애플리케이션 서비스는 도메인 객체를 서로 협조하게 해서 유스케이스를 구현한다.

애플리케이션 서비스는 도메인 객체가 수행하는 태스크를 관리하고 문제를 해결하게 이끄는 존재다.

1. 애플리케이션 서비스란 무엇인가

애플리케이션 서비스를 한마디로 표현하면 유스케이스를 구현하는 객체라고 할 수 있다.

도메인 객체는 도메인을 코드로 옮긴 것이다. 도메인을 코드로 나타냈다고 해도 그것만으로는 이용자가 당면한 문제나 필요가 해결되지 않는다. 이용자의 필요를 만족시키거나 문제를 해결하려면 도메인 객체의 힘을 하나로 엮어 올바른 방향으로 이끌어야 한다. 이러한 일을 하는 객체를 애플리케이션 서비스라고 하며 도메인 객체를 조작해서 이용자의 목적을 달성하게 이끈다.

2. 유스케이스 수립하기

하나의 시스템을 이루기 위해 반드시 개발이 필요한 요소를 골라내기 위해 우선 사용자 기능이 어떤 것인지 부터 살펴야 한다.

필요에 따라 도메인 객체인 엔티티, 도메인 서비스를 추가한다.

애플리케이션 서비스가 아닌 객체가 도메인 객체를 자유롭게 조작하는 것을 주의해야 한다. 도메인 객체의 행동을 호출하는 것은 애플리케이션 서비스의 책임이다. 이 구조가 지켜진다면 도메인 객체의 행동을 호출하는 코드가 모두 애플리케이션 서비스 안에 모여 있지만, 그렇지 않다면 여러 곳에 코드가 흩어질 수 있다.

이 외에 도메인 객체에 대한 의존이 많이 발생하는 것도 문제다. 도메인의 변화가 즉시 객체에 반영돼야 하는데, 복잡한 의존 관계의 핵심이 되는 코드를 수정하는 것은 조심스러운 작업이다.

도메인 객체를 외부에 공개한다는 선택은 각 처리의 코드를 단순하게 만들 수는 있지만, 그 대가로 많은 위험성을 안게 된다. 도메인 객체는 비공개로 남겨두고 클라이언트에 데이터 전송을 위한 객체(DTO, data transfer object)를 만들어 여기에 데이터를 옮겨 넣어 반환하는 방법을 추천한다.

DTO를 적용하면 DTO를 정의하는 데 필요한 수고와 데이터를 옮겨 담는 데서 오는 약간의 성능 저하가 따르지만, 불편한 의존을 줄이고 도메인 객체의 변경을 방해받지 않는 편익이 더 크다.

3. 도메인 규칙의 유출

애플리케이션 서비스는 도메인 객체가 수행하는 태스크를 조율하는 데만 전념해야 한다. 애플리케이션 서비스에 도메인 규칙을 기술해서는 안 된다. 도메인 규칙이 애플리케이션 서비스에 기술되면 같은 코드가 여러 곳에서 중복되는 현상이 나타난다. 이렇게 되면 향후 수정시에도 수정이 필요한 곳을 빠뜨려 발생하는 버그를 막을 수 있다.

4. 애플리케이션 서비스와 프로그램의 응집도

프로그램에는 응집도라는 개념이 있다. 응집도는 모듈의 책임 범위가 얼마나 집중되어 있는지 나타내는 척도다. 응집도가 높으면 모듈의 견고성, 신뢰성, 재사용성, 가독성 측면에서 바람직하다.

응집도를 높이려면 간단히 클래스를 분리하면 된다. 그러나 ‘유스케이스마다 클래스를 반드시 분리하라' 라는 말은 아니다. 응집도가 절대적인 지표가 되는 것이 아니기 때문에 응집도를 코드를 정돈하기 위한 참고사항으로 기억해두면 된다.

5. 애플리케이션 서비스의 인터페이스

애플리케이션 서비스의 인터페이스를 정의하면 클라이언트 측의 편의성이 높아진다.

애플리케이션 서비스의 인터페이스를 미리 만들어 두면 이를 구현한 목업 객체를 이용해 애플리케이션 서비스의 실제 구현이 완료되기를 기다릴 필요 없이 클라이언트의 구현을 진행할 수 있다. 목업 객체는 테스트하고자 할 때도 유용하다.

6. 서비스란 무엇인가.

도메인과 관련된 활동은 도메인 서비스, 애플리케이션이 되기 위한 서비스는 애플리케이션 서비스가 된다.

도메인 서비스는 도메인 지식을 나타낸 도메인 객체다. 애플리케이션 서비스는 이용자의 문제를 해결하기 위한 것이다. 소프트웨어라면 반드시 그 애플리케이션만의 기능이 있다.

도메인 서비스와 애플리케이션 서비스는 대상 영역은 다르지만, 본질적으로는 같은 것이다. 같은 서비스지만, 그 방향이 도메인이냐 애플리케이션이냐에 따라 나뉜다.

6–1.서비스는 무방비 상태다

서비스는 자신의 행동을 변화시키는 것을 목적으로 하는 상태를 갖지 않는다. 하지만 이를 서비스가 전혀 상태를 갖지 않는다고 이해하면 안된다.

첨언
우리가 알고있는 앱의 비즈니스 로직은 도메인 로직과 애플리케이션 로직을 포함한 개념이다.

도메인 서비스와 애플리케이션 서비스를 나누는 것이 어려운데 기계적으로 나눠보자면 도메인 모델의 행위를 도메인 서비스, 그 외의 행위들을 애플리케이션 서비스라고 보면되겠다.

--

--

No responses yet