[DDD] SERVICE(서비스)

0️⃣1️⃣·2024년 1월 29일
0

DDD

목록 보기
2/21
post-custom-banner

아래 내용들은 도메인에서 중요한 의미를 지닌 SERVICE에 관련한 내용

SERVICE 필요성

자신의 본거지를 ENTITY나 VALUE OBJECT에서 찾지 못하는 중요한 도메인 연산이 있다. 이들 중 일부는 본질적으로 사물이 아닌 활동(activity)이나 행동(action)인데, 우리의 모델링 패더라임이 객체이므로 그러한 연산도 객체와 잘어리게끔 노력해야 한다. (도메인 주도 개발 - Eric evans)

SERVICE의 정의

도메인의 개념 가운데 객체로는 모델에 어울리지 않는 것이 있다. 필요한 도메인 기능을 ENTITY나 VALUE에서 억지로 맡게 하면 모델에 기반을 둔 객체의 정의가 왜곡되거나, 또는 무의미하고 인위적으로 만들어진 객체가 추가될 것이다. (도메인 주도 개발 - Eric evans)

SERVICE는 모델에서 독립적인 인터페이스로 제공되는 연사으로서 ENTITY나 VALUE OBJECT와 달리 상태를 캡슐화하지 않는다. 기술적인 프레임워크에서는 SERVICE가 흔히 사용되는 패턴이지만 SERVICE는 도메인 계층에도 마찬가지로 적용될 수 있다. (도메인 주도 개발 - Eric evans)

서비스라는 이름은 다른 객체와의 관계를 강조한다. ENTITY나 VALUE OBJECT와 달리 SERVICE를 정의하는 기준은 순전히 클라이언트에 무엇을 제공할 수 있느냐에 있다. ENTITY가 주로 동사나 명사로 이름을 부여하는 것과 달리 SERVICE는 주로 활동으로 이름을 짓는다. (도메인 주도 개발 - Eric evans)

  • Order(동사), Transaction(명사)

도메인의 중대한 프로세스나 변환 과정이 ENTITY나 VALUE OBJECT의 고유한 책임이 아니라면 연산을 SERVICE로 선언되는 독립 인터페이스로 모델에 추가하라. 모델의 언어라는 측면에서 인터페이스를 정의하고 연산의 이름을 UBIQUITOUS LANGUAGE의 일부가 되게끔 구성하라. SERVICE는 상태를 갖지 않게 만들어라. (도메인 주도 개발 - Eric evans)

응용 서비스, 인프라스터럭쳐 서비스

도메인 SERVICE와 응용 SERVICE는 인프라스터럭처 SERVICE와 협업하는데, 예를 들면 은행에는 계좌 잔고가 일정 금액 아래로 떨어지면 고객에게 이메일을 발송하는 애플리케이션이 있을지도 모른다. 이때 이메일 시스템과 통지 수단을 캡슐화하는 인터페이스는 인프라스터럭쳐 계층의 SERVICE에 해당한다. (도메인 주도 개발 - Eric evans)

응용 SERVICE를 도메인 SERVICE와 구분하는 것은 더 어려울 수 있다. 응용 계층은 통지를 관리할 책임이 있다. 계좌 잔고가 일정 금액에 도달했는지를 판단하는데 SERVICE가 필요하지 않더라도 이 작업에 대한 책임은 도메인 계층에 있다. 왜냐하면 이것은 "계좌" 객체의 책임에 어울리기 때문이다. 이러한 뱅킹 애플리케이션은 자금 이체를 책임질 수도 있다. 이체에 대한 입출금 승인을 SERVICE에서 수행하게 되어 있다면 해당 기능은 도메인 계층에 속할 것이다. 자금 이체는 업무 도메인에서 의미가 있으며, 중요한 업무 규칙을 포함한다. 기술과 관련된 SERVICE에는 업무와 관련된 어떤 것도 포함돼서는 안 된다. (도메인 주도 개발 - Eric evans)

예를 들어, 뱅킹 어플리케이션에서 거래를 분석할 수 있게 스프레드시트 파일로 거래내역을 변환해 내보낼 수 있다면 그러한 내보내기 기능은 응용 SERVICE에 해당한다. 은행 업무 도메인에서는 "파일 형식"이라는 것이 아무런 의미가 없으며, 그것과 관련된 어떠한 업무 규칙도 없기 때문이다. (도메인 주도 개발 - Eric evans)

한편 한 계좌에서 다른 계좌로 자금을 이체하는 기능은 도메인 SERVICE에 해당한다. 자금 이체 기능에는 중요한 업무 규칙이 포함돼 있고, "자금 이체"는 중요한 은행업무 도메인 용어이기 때문이다. 이 경우 SERVICE가 그 자체로는 많은 일을 하지 않으며, 두 Account(계좌) 객체가 대부분의 일을 수행하도록 요청할 것이다. 그러나 "이체" 연산을 Account 객체에 집어넣는 것은 다소 부자연스러울 수도 있는데, 왜냐하면 이체 연산은 두 계좌와 일부 전역적인 규칙을 수반하기 때문이다. (도메인 주도 개발 - Eric evans)

  • 응용 서비스에서는 도메인 서비스 호출, 인프라스터럭쳐 서비스를 이용할 수 있음
  • 도메인 서비스는 오직 업무 로직만을 포함해야 함, 그 외의 서비스에서는 업무 로직을 포함해서는 안됨

Reference

post-custom-banner

0개의 댓글