architecture/micro service

[arch] DDD pattern 와 aggregate란

방푸린 2022. 1. 13. 12:36
반응형

axon을 공부하다 보면 DDD패턴과 aggregate이라는 개념이 계속 나온다. 간단하게 이해해보자.

 

DDD(Domain Driven Design)란?

  • 도메인 중심으로 설계하는 디자인 방법론
  • 특히 여기서는 비즈니스 Domain별로 나누어 설계하는 것에 가까움(개발 중심이 아닌, 타 부서와의 communication을 위해)
  • DDD의 핵심 목표는 "Loosly coupling", "High cohesion"(어플리케이션 또는 그 안의 모듈 간의 의존성은 최소화하고, 응집성은 최대화)

 

Domain이란?

  • 사전적 의미는 영역 / 집합
  • DDD에서의 Domain은 비즈니스 Domain으로, 유사한 업무의 집합으로 이해할 수 있음
  • 어플리케이션은 비즈니스 Domain별로 나누어 설계 및 개발될 수 있음
  • 예) 어떤 서비스에서 회원가입, 회원탈퇴를 하는 작업은 모두 '회원'과 관련된 작업이다. 여기서 회원이 도메인이다.

 

Aggregate 란?

  • Aggregate는 서로 관련이 있는 도메인 모델들의 집합
  • 대부분의 경우 하나의 애그리거트는 하나의 엔티티와 여러 개의 밸류로 구성된다. 드물게 하나의 애그리거트에 여러 개의 엔티티가 존재하기도 한다.
  • Agreegate의 키 값을 가진 엔티티를 Agreegate Root이라고 하며 다른 연관된 엔티티의 키를 들고 있다.
  • Aggregate 패턴의 특징
    • Aggregate 는 내부의 도메인 객체들을 완전히 독점 소유한다. 객체들은 오직 하나의 Aggregate 에만 속하게 되고 객체들의 lifetime 은 속해있는 Aggregate의 lifetime에 제한된다(Aggregate 가 삭제되면 내부의 객체들도 같이 삭제됨).
    • Aggregate는 항상 내부 객체들의 불변성을 강제해야 한다. Aggregate 내부는 항상 비즈니스 룰에 부합하는 상태를 유지해야 한다.
    • Aggregate 각각이 transaction boundary 가 된다. 즉 하나의 트랜잭션에서는 하나의 Aggregate 만 변경할 수 있다. 여러 개의 Aggregate 들을 한 트랜잭션으로 변경하는 것은 불가능하다.

 

 

MSA에서 서비스와 DDD에서 Aggregate의 차이점

  1. 서비스 (MSA)
    • MSA 서비스는 비즈니스 기능을 캡슐화한 독립적인 배포 단위입니다. 각 서비스는 자신만의 데이터베이스를 가지고 있으며, 다른 서비스와 통신할 때는 API, 메시지 큐, 또는 이벤트 버스 등을 사용합니다.
    • MSA의 서비스는 특정 비즈니스 도메인을 구현하는 것이 목표입니다. 예를 들어, 주문 서비스, 결제 서비스, 배송 서비스처럼 각 서비스는 독립적으로 개발되고 배포됩니다.
  2. 애그리게잇 (DDD)
    • **애그리게잇(Aggregate)**은 하나의 도메인 모델 내에서 일관성을 유지하기 위한 경계입니다. 애그리게잇은 도메인 모델의 일부로 여러 엔티티와 값 객체(Value Object)를 묶어놓은 것으로, 그 내부에서 비즈니스 규칙을 강제합니다. 한 트랜잭션 내에서 일관성을 유지하는 것이 목적입니다.
    • 애그리게잇은 하나의 서비스 내에서도 여러 개가 존재할 수 있습니다. 예를 들어, 주문 서비스 안에 Order 애그리게잇, OrderItem 애그리게잇이 있을 수 있습니다.

서비스가 애그리게잇과 다른 이유

  • 경계의 범위: MSA 서비스는 독립적인 배포 및 실행 단위를 의미하며, 도메인 모델 내의 애그리게잇보다 더 큰 경계를 가지고 있습니다. 반면, 애그리게잇은 하나의 서비스 내에서 일관성을 유지하기 위한 내부 경계입니다.
  • 트랜잭션 관리: 애그리게잇은 하나의 트랜잭션 내에서 일관성을 유지하기 위해 설계된 반면, 서비스는 서로 다른 트랜잭션을 가지고 상호작용할 수 있습니다. 예를 들어, 주문 서비스와 결제 서비스는 서로 다른 트랜잭션을 사용하지만, 각 서비스 내의 애그리게잇은 그 안에서 트랜잭션을 공유합니다.
  • 서비스 간 통신: MSA에서는 서비스 간 통신을 위해 API 호출이나 메시징 시스템을 사용하지만, 애그리게잇은 동일한 도메인 모델 내에서 직접 참조됩니다.

언제 서비스가 애그리게잇처럼 보일 수 있는가?

특정 상황에서는 MSA 서비스가 하나의 애그리게잇과 비슷하게 보일 수 있습니다. 특히, 서비스가 아주 작고, 하나의 도메인 모델에 집중하여 트랜잭션 경계를 관리하는 경우라면, 그 서비스가 그 도메인의 애그리게잇처럼 느껴질 수 있습니다. 예를 들어, 주문 서비스가 "주문"이라는 단일 애그리게잇을 중심으로 동작하고, 그 내부에서 일관성 있는 트랜잭션 처리를 한다면, 서비스와 애그리게잇의 경계가 겹칠 수 있습니다.

하지만 일반적으로, MSA에서의 서비스는 여러 애그리게잇을 포함할 수 있으며, 그 자체로 Aggregate의 개념을 대체하는 것은 아닙니다.


참고

https://sgc109.github.io/2020/08/09/ddd-aggregate/

 

DDD 의 Aggregate

본 글에서는 도메인 주도 설계(Domain Driven Design) 에서 굉장히 중요한 개념인 애그리거트(Aggregate)에 대해 알아본다.

sgc109.github.io

https://khalilstemmler.com/articles/typescript-domain-driven-design/aggregate-design-persistence/

 

How to Design & Persist Aggregates - Domain-Driven Design w/ TypeScript | Khalil Stemmler

In this article, you'll learn how identify the aggregate root and encapsulate a boundary around related entities. You'll also learn how to structure and persist aggregates using the Sequelize ORM on White Label, the open-source Vinyl Trading app.

khalilstemmler.com

https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-domain-model

 

마이크로 서비스 도메인 모델 디자인

컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처 | DDD 지향 도메인 모델을 디자인할 때 주요 개념을 이해합니다.

docs.microsoft.com

https://www.secmem.org/blog/2020/02/19/ddd-aggregate-pattern/

 

728x90
반응형