책/도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지

[도메인 주도 개발 시작하기] 7장: 도메인 서비스

2022. 10. 21. 12:21
목차
  1. 7.1 여러 애그리거트가 필요한 기능
  2. 7.2 도메인 서비스
본문은 [도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지]를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.

 

7.1 여러 애그리거트가 필요한 기능

  • 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안 된다
    • 억지로 구현하면 애그리거트는 자신의 책임 범위를 넘어서는 기능을 구현하기 때문에 코드가 길어지고 외부에 대한 의존이 높아지게 되며 코드를 복잡하게 만들어 수정을 어렵게 만드는 요인이 된다
    • 게다가 애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어들어 명시적으로 드러나지 않게 된다
  • 도메인 기능을 별도 서비스로 구현함으로써 이런 문제를 해결할 수 있다

 

 

7.2 도메인 서비스

  • 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다
  • 주로 다음 상황에서 도메인 서비스를 이용한다
    • 계산 로직: 여러 애그리거트가 필요한 계산 로직이나, 한 애그리거트에 넣기에는 다소 복잡한 계산 로직
    • 외부 시스템 연동이 필요한 도메인 로직: 구현하기 위해 타 시스템을 사용해야 하는 도메인 로직

 

1) 계산 로직과 도메인 서비스

  • 한 애그리거트에 넣기 애매한 도메인 개념을 구현할 때 도메인 서비스를 이용하면 도메인 개념이 보다 명시적으로 드러나게 된다
  • 응용 영역의 서비스가 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다룬다
  • 도메인 서비스는 상태 없이 로직만 구현하며, 도메인 서비스를 구현하는 데 필요한 상태는 다른 방법으로 전달받는다
  • 도메인 서비스는 도메인의 의미가 드러나는 용어를 타입과 메서드 이름으로 짓는다
    • 예를 들어 할인 금액 계산 로직을 위한 도메인 서비스명은 DiscountCalculationService로 지을 수 있다
  • 도메인 서비스를 사용하는 주체는 애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다
    • 이때, 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임이다
  • 도메인 서비스를 애그리거트가 사용할 때 도메인 서비스 객체를 애그리거트에 주입하지 않도록 주의해야 한다
    • 도메인 모델의 데이터를 담는 필드는 모델에서 중요한 구성요소지만, 도메인 서비스 타입의 필드는 데이터 자체와는 관련이 없으며 DB의 저장 대상도 아니다
    • 또 애그리거트는 일부 기능에 한해서만 도메인 서비스를 필요로 한다
    • 따라서 프레임워크가 제공하는 의존성 주입(@Autowired 등)을 이용해서 의존성을 해결하기 보다는 해당 도메인 서비스 객체를 메서드의 파라미터로 전달하고, 응용 서비스에서 이를 전달받을 수 있도록 코드를 작성하자

 

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

  • 외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있다
  • 시스템 간 연동은 특정 기술에 의존하지만, 도메인 입장에서는 해당 연동 기능을 도메인 로직으로 볼 수 있다
  • 도메인 로직은 아래와 같이 도메인 서비스로 표현할 수 있다
    • 중요한 점은 도메인 로직 관점에서 인터페이스를 작성했다는 것이다
    • 외부 시스템과 연동한다는 관점으로 인터페이스를 작성하지 안핬다
// 사용자가 설문 조사 생성권한을 가진 역할인지 확인하는 도메인 서비스
public interface SurveyPermissionChecker {
    boolean hasUserCreationPermission(String userId);
}
  • 응용 서비스는 이 도메인 서비스를 이용해서 생성 권한을 검사하고, 인터페이스를 구현한 클래스는 인프라스트럭처에 영역에 위치한다

 

3) 도메인 서비스의 패키지 위치

  • 도메인 서비스는 도메인 로직을 표현하므로 다른 도메인 구성요소와 동일한 패키지에 위치한다
  • 도메인 서비스의 개수가 많거나 엔티티나 밸류와 같은 다른 구성요소와 명시적으로 구분하고 싶다면 domain 패키지 밑에 domain.model, domain.service, domain.repository와 같이 하위 패키지를 구분하여 위치시켜도 된다

 

4) 도메인 서비스의 인터페이스와 클래스

  • 도메인 서비스의 로직이 고정되어 있지 않은 경우 도메인 서비스 자체를 인터페이스로 구현하고 이를 구현한 클래스를 둘 수도 있다
    • 특히 도메인 로직을 외부 시스템이나 별도 엔진을 이용해서 구현할 때 인터페이스와 클래스를 분리하게 된다

  • [그림 7.2]와 같이 도메인 서비스의 구현이 특정 구현 기술에 의존하거나 외부 시스템의 API를 실행한다면 도메인 영역의 도메인 서비스는 인터페이스로 추상화해야 한다
    • 이를 통해 도메인 영역이 특정 구현에 종속되는 것을 방지할 수 있고 도메인 영역에 대한 테스트가 쉬워진다
저작자표시 비영리 (새창열림)

'책 > 도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지' 카테고리의 다른 글

[도메인 주도 개발 시작하기] 9장: 도메인 모델과 바운디드 컨텍스트  (1) 2022.10.28
[도메인 주도 개발 시작하기] 8장: 애그리거트 트랜잭션 관리  (0) 2022.10.24
[도메인 주도 개발 시작하기] 6장: 응용 서비스와 표현 영역  (0) 2022.10.14
[도메인 주도 개발 시작하기] 5장: 스프링 데이터 JPA를 이용한 조회 기능  (0) 2022.10.07
[도메인 주도 개발 시작하기] 4장: 리포지터리와 모델 구현  (0) 2022.10.03
  1. 7.1 여러 애그리거트가 필요한 기능
  2. 7.2 도메인 서비스
'책/도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지' 카테고리의 다른 글
  • [도메인 주도 개발 시작하기] 9장: 도메인 모델과 바운디드 컨텍스트
  • [도메인 주도 개발 시작하기] 8장: 애그리거트 트랜잭션 관리
  • [도메인 주도 개발 시작하기] 6장: 응용 서비스와 표현 영역
  • [도메인 주도 개발 시작하기] 5장: 스프링 데이터 JPA를 이용한 조회 기능
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 브루트포스
  • atdd
  • BOJ
  • http
  • dp
  • Git
  • 그래프 탐색
  • 깊이 우선 탐색
  • 백준
  • fastapi
  • 그래프
  • 장고
  • Shortest Path
  • 파이썬
  • mysql

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[도메인 주도 개발 시작하기] 7장: 도메인 서비스
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.