어 나 갱수.

도메인 주도 설계(DDD: Domain-Driven Design)이란? 본문

카테고리 없음

도메인 주도 설계(DDD: Domain-Driven Design)이란?

김경수 2023. 7. 27. 19:20
728x90

 

DDD란?

애플리케이션을 개발함에 있어 성능, 생산성, 안정성 모두 뛰어난 애플리케이션을 만들기 위해서는 애플리케이션 설계를 잘하는 것이 중요하다. 어떻게 하면 더 나은 애플리케이션을 잘 설계할 수 있는지 고민하던중 DDD라는 구현 기법을 알게되었다.

 

DDD는 좋은 설계 및 구현 기법이지만, DDD의 개념을 완벽히 이해하는것은 쉽지 않다.

 

도메인(Domain)

애플리케이션을 구성할 때 도메인이라는 단어는 비즈니스적인 어떤 업무 영역과 관련이 있다.

 

도메인을 쉽게 이해해보자!!

상품주문 애플리케이션을 만든다고 가정한다.

상품 주문 애플리케이션은 상품을 주문하는 고객, 주문받은 상품을 만드는 공장, 상품을 배달하는 배달원, 해당 상품을 주문하고 결제하는데 이용되는 카드사 또는 은행이 있다.

 

고객, 공장, 배달원, 카드사 이들을 각각 도메인이라고 부를 수 있다.

이렇게 애플리케이션을 구분하기 위해 필요한 업무들을 자세히 구분하면 좋은 애플리케이션을 구성할 수 있다.

 

해당 업무에서 고객이 상품을 주문하는 과정, 주문받은 상품 처리하는 과정, 상품 배달하는 과정 등 도메인 지식들을 서비스 계층에서 비즈니스 로직으로 구현해야 하는 것이다.

 

즉, 현실에서 도메인은 업무들의 영역들을 말한다.

 

상품 주문 애플리케이션의 도메인

위 사진은 상품 주문 애플리케이션에서 필요한 도메인들을 대략적으로 추출해보았다.

상위 도메인

회원, 주문, 상품, 결제, 배달

하위 도메인

회원 : 회원정보, 결제 내역

주문 : 주문의 정보, 주문자의 정보, 상품의 정보, 배달 추적 정보, 배달 주소 정보

결제 : 결제 정보

상품 : 상품의 이름. 상품의 가격

배달 : 상품의 이름. 주문자의 정보

 

애그리거트(Aggregate)

에그리거트란 비슷한 업무 도메인들의 묶음이다.

 

애그리거트는 모델이나 비즈니스 도메인을 이해하기 위한 거시적인 방법으로 사용된다.

개별 객체 수준의 모델만을 참고하여 도메인을 분석하게 되면 무엇이 중요하고 핵심인지 한눈에 파악하기가 힘들다. 

하지만 애그리거트를 사용하면 도메인을 먼저 이해하고 객체 수준의 모델을 바라볼 수 있으니 무엇이 핵심인지 파악할 수 있다.

성질

애그리거트의 핵심은 도메인을 이해하기 쉬운 구조로 만들어 주는 것이다.

  • 애그리거트에 속한 객체는 유사하거나 동일한 생명주기(Life cycle)을 가진다.
  • 애그리거트는 경계를 가진다.
    • 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.

애그리거트 루트(Aggregate root)

애그리거트 전체를 관리할 주체를 의미한다. 애그리거트를 대표하는 엔티티 객체이며 루트 엔티티라고 부르기도 한다. 애그리거트에 속한 객체는 루트 엔티티에 직접/간접적으로 속하게 된다. 애그리거트가 정상적으로 동작하기 위해 애그리거트를 담당/관리할 객체가 필요하다.

이것이 바로 애그리거트 루트이다.

  • 애그리거트 루트의 핵심 역할은 애그리거트의 일관성이 깨지지 않도록 조율하는 것이다.
  • 애그리거트 루트는 애그리거트가 제공해야 할 도메인 기능을 제공한다.

애르리거트 루트 선정

  • 회원 애그리거트 : '결제 내역'이 얼마인지 알려면 '결제 내역'을 가지는 회원정보를 알아야한다. 따라서 회원 정보 도메인이 애그리거트 루트가 된다.
  • 주문 애그리거트 : ‘주문 정보’는 다른 모든 도메인(주문자 정보, 상품 정보, ... 등)과 직접적으로 연관이 있다. 따라서 주문 정보 도메인이 애그리거트 루트가 된다.
  • 상품 애그리거트 : 상품의 이름이 애그리거트 루트가 된다.
  • 결제 애그리거트 : 결제 정보가 애그리거트 루트가 된다.
  • 배달 애그리거트 : 상품의 이름이 애그리거트 루트가 된다.

Reference

728x90