인프런 커뮤니티 질문&답변

아무도_모를_아이디님의 프로필 이미지
아무도_모를_아이디

작성한 질문수

Microservice 내부 아키텍처 와 EventStorming 설계

애그리거트 패턴 구성요소 - Domain Service,Repository,Factory 그리고 응용서비스

도메인 서비스와 응용서비스의 구분

해결된 질문

작성

·

1.1K

0

도메인 서비스와 응용서비스를 구분할 수 있는 조건이 무엇일까요?

사내 프로젝트 마다 달랐고, 항상 경계가 모호해서 해당 프로젝트의 정책에 맞추어 개발했는데 이 부분에 대해 의견을 듣고 싶습니다.

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 1

1

han jeong heon님의 프로필 이미지
han jeong heon
지식공유자

움 도메인 서비스와 응용서비스는 이런 차이가 있다고 생각합니다.

도메인 서비스:

  1. 도메인 관련 논리: 도메인 서비스에는 본질적으로 도메인 모델과 관련된 논리를 포함하고  도메인 내의 특정 엔터티나 값 개체에 자연스럽게 속하지 않는 동작이나 작업을 캡슐화합니다.

  2. 복잡한 비즈니스 논리: 또한 여러 엔터티 또는 값 개체와 관련된 복잡한 비즈니스 규칙이나 작업 구현를 위해 사용됩니다.

  3. 상태 비저장:  일반적으로 상태 비저장입니다. 입력을 받고, 작업을 수행하고, 해당 입력을 기반으로 결과를 반환하지만 장기적인 상태를 유지하지는 않습니다.

  4. 이름 지정: 도메인 서비스의 이름은 일반적으로 도메인 개념, 작업 또는 캡슐화하는 특정 동작을 설명하는 동사를 기반으로 지정됩니다. 예를 들어 'PaymentService' 또는 'ReservationService'입니다.

 

응용 프로그램 서비스:

  1. 애플리케이션 흐름:  애플리케이션의 흐름을 조정하고 도메인 계층(엔티티, 값 개체 및 도메인 서비스)과 외부 영역(예: UI, 저장소, 및 외부 시스템)과의 관계를 상호작용합니다.

  2. 트랜잭션 관리: 특히 데이터베이스와 상호 작용하는 맥락에서 트랜잭션 시작, 커밋 또는 롤백을 포함한 트랜잭션 관리를 처리하는 경우가 많습니다.

  3. 특정 사용 사례(usecase): 애플리케이션 서비스는 특정 사용 사례 또는 애플리케이션 작업과 밀접하게 연결되어 있습니다. 이는 사용자나 외부 시스템이 애플리케이션 내에서 수행할 수 있는 usecase나 작업에 매핑되는 경우가 많습니다..

  4. 이름 지정: 애플리케이션 서비스의 이름은 일반적으로 특정 도메인 개념보다는 지원하는 usecase나 작업의 이름을 따서 지정됩니다. 예를 들어 "UserService" 또는 "OrderProcessingService"입니다.

 

정리하면, 도메인 서비스는 복잡한 도메인 논리를 캡슐화하는 데 중점을 두고 도메인 지식을 기반으로 설계되는 반면, 애플리케이션 서비스는 애플리케이션 수준 문제를 처리하고 상호 작용을 조정하며 트랜잭션을 관리합니다. 

ㅎ 뭐 개념은 이렇지만 저도 항상 어렵고, 고민 되는 부분입니다.

그래서 실제로는 응용서비스는 보통 유스케이스 단위로 작성하고, 도메인 서비스는 특정 엔티티나 vo의 책임이 아니라고 생각되는 경우에만 작성하고 있습니다. 

 

안녕하세요. 상세한 답변에 깜짝 놀랐습니다.

조금 바쁘기도 했고 생각을 정리하느라 답글이 늦었습니다.

 

질문 드리고 나서 생각해봤는데 나름 결론 내린 내용과 답변 주셔서 제 생각이 크게 틀리지 않았던 것 같습니다. 

 

도메인 서비스와 응용서비스를 명확하게 구분 짓기가 어려울 때도 있고

도메인 서비스에 구현하기에 도메인과 안맞는 기능들도 있고

굳이 응용서비스를 만들어야 하냐는 의견도 있기도 하고

응용서비스의 이름을 Service로 명명하지 않아 의견도 분분한 부분도 있고요 ^^ 

보통은 목소리 큰사람이 이기죠. 뭐 그렇습니다 :)

 

응용서비스를 구현할 때 불편했던 점이 응용, 도메인 서비스 리소스가 섞여서 뭐가 응용이고 도메인인지 구분하기 위해 리소스 이름을 보면서 순간적으로 판단을 하는데 이 시간이 아깝더라고요.

 

제가 내린 결론은 응용 서비스를 사용하되 패키지를 나누면 한 패키지 안에 도메인, 응용서비스를 넣지 말고  패키지를 나눠서 관리하면 서로 구분되도 되고 

레이어도 나눌수 있지 않을까 하네요. 

 

이번 답변도 감사하고 풍요로운 추석 되시길 바랍니다.

 

아무도_모를_아이디님의 프로필 이미지
아무도_모를_아이디

작성한 질문수

질문하기