[DDD] 응용 서비스와 표현 영역 -2

2025. 5. 11. 22:27·📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의  도메인 주도 개발 시작하기 (P.202~206)를 읽고 정리한 글입니다.

 

응용 서비스의 역할

응용 서비스는 사용자(클라이언트)가 요청한 기능을 실행한다. 응용 서비스는 사용자의 요청을 처리하기 위해 리포지터리에서 도메인 객체를 가져와 사용한다. 표현 영역 입장에서 보았을 때 응용 서비스는 도메인 영역과 표현 영역을 연결해 주는 창구 역할을 한다.

 

응용 서비스는 주로 도메인 객체 간의 흐름을 제어하기 때문에 다음과 같이 단순한 형태를 갖는다.

public Result doSumeFun(SomeReq req) {
	// 1.리포지터리에서 애그리거트를 구한다.
    SomeAgg agg = someAggRepository.findById(req.getId());
    checkNull(agg);
    
    // 2.애그리거트의 도메인 기능을 실행한다.
    agg.doFunc(req.getValue());
    
    // 3.결과를 리턴한다.
    return createSuccessResult(agg);
}

public Result doSomeCreation(CreateSomeReq res) {
	// 1.데이터 중복 등 데이터가 유효한지 검사
    validate(req);
    
    // 2.애그리거트를 생성한다.
    SomeAgg newAgg = createSome(req);
    
    // 3.리포지터리에 애그리거트를 저장한다.
    someAggRepository.save(newAgg);
    
    // 4.결과를 리턴한다.
    return createSuccessResult(newAgg);
}

응용 서비스가 복잡하다면 응용 서비스에서 도메인 로직의 일부를 구현하고 있을 가능성이 높다. 만약 이렇게 된다면, 코드 중복, 로직 분산 등 코드 품질에 안 좋은 영향을 줄 수 있다.

 

응용 서비스는 트랜잭션 처리도 담당한다. 응용 서비스는 도메인의 상태 변경을 트랜잭션으로 처리해야 한다.


도메인 로직 넣지 않기

도메인 로직을 도메인 영역과 응용 서비스에 분산해서 구현하면 코드 품질에 문제가 발생한다.

 

첫 번째 문제는 코드의 응집성이 떨어진다는 것이다. 도메인 데이터와 그 데이터를 조작하는 도메인 로직이 한 영역에 위치하지 않고 서로 다른 영역에 위치한다는 것은 도메인 로직을 파악하기 위해 여러 영역을 분산해야 한다는 것을 알 수 있다.

 

두 번째 문제는 여러 응용 서비스에서 동일한 도메인 로직을 구현할 가능성이 높아진다는 것이다. 즉, 로직이 중복 될 수 있다.

 

만약 이렇게 된다면 소프트웨어가 가져야할 중요한 경쟁 요소 중 하나인 변경 용이성을 놓치게 된다.


응용 서비스의 책임을 명확히 구분하지 않으면, 어느새 로직이 이곳저곳 흩어져 응집도도 낮고 테스트도 어려운 구조가 되기 쉽다. 이번에 읽은 내용을 바탕으로, 다음 프로젝트에선 도메인 객체가 책임을 명확히 갖고 응용 서비스는 흐름만 담당하는 구조를 직접 적용해볼 계획이다. 특히 상태 변화가 있는 기능에는 트랜잭션을 명확히 걸어주는 것도 다시 신경 써야겠다.
저작자표시 비영리 변경금지 (새창열림)

'📚 개발자의 서재 > 도메인 주도 개발 시작하기' 카테고리의 다른 글

[DDD] 응용 서비스와 표현 영역 -4  (0) 2025.05.13
[DDD] 응용 서비스와 표현 영역 -3  (0) 2025.05.12
[DDD] 응용 서비스와 표현 영역 -1  (0) 2025.05.10
[DDD] 스프링 데이터 JPA를 이용한 조회 기능 -3  (0) 2025.05.09
[DDD] 스프링 데이터 JPA를 이용한 조회 기능 -2  (0) 2025.05.08
'📚 개발자의 서재/도메인 주도 개발 시작하기' 카테고리의 다른 글
  • [DDD] 응용 서비스와 표현 영역 -4
  • [DDD] 응용 서비스와 표현 영역 -3
  • [DDD] 응용 서비스와 표현 영역 -1
  • [DDD] 스프링 데이터 JPA를 이용한 조회 기능 -3
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    타입
    매핑 구현
    객체
    오블완
    책임
    코딩트리조별과제
    specification
    객체지향의 사실과 오해
    애그리거트 루트
    표현 영역
    코딩테스트
    인터페이스
    good code bad code
    가독성
    애그리거트
    메시지
    유스케이스
    협력
    리포지터리
    티스토리챌린지
    모듈화
    DIP
    코드 계약
    도메인 주도 개발 시작하기
    추상화
    책임-주도 설계
    역할
    코드트리
    도메인 모델
    캡슐화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[DDD] 응용 서비스와 표현 영역 -2
상단으로

티스토리툴바