들어가며
애그리거트는 DDD에서 굉장히 자주 등장하는 용어입니다. 항상 개발을 공부할 때마다 느끼는 것은 정의가 천차만별 이라는 것입니다. 이번 포스팅에서는 이 '애그리거트'의 정의와 간단한 예시를 알아보고자 합니다.
📌 애그리거트의 등장 배경
보통 DDD에 대한 설명을 할 때 설명의 예시가 되는 시스템으로 '온라인 쇼핑몰'에 대한 예시를 많이 들고 있습니다. 개인적으로는 온라인 쇼핑몰 e-커머스 시스템이 고객, 주문, 결제, 상품 등 다양한 서브 도메인들로 이루어져 있기 때문이 아닐까 싶습니다. 저 또한 e-커머스 시스템을 예시로 들도록 하겠습니다.
e-커머스 시스템을 상위 수준에서 모델을 정리하면 다음과 같을 수 있습니다.
이러한 상위 수준에서의 모델을 개별 객체 수준으로 나타내면 다음과 같습니다.
그런데 이러한 도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델과 전체적인 도메인을 이해하려고 하게 되고 전체적인 수준에서의 도메인 간의 관계를 파악하기가 점점 어려워지게 됩니다. 도메인 간의 관계를 파악하기 어렵게 되면 자연스럽게 코드를 변경하고 도메인을 확장하는 등의 일들이 어려워지는 것을 뜻하게 됩니다. 특정 객체 모델이 어느 객체 모델과 어떠한 관계를 맺고 있는지 파악하기 어렵기 때문에 새로운 비즈니스 요구사항이 있더라도 이를 선뜻 수정하기 어렵게 되는 것입니다.
이러한 문제를 해결하기 위해 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 이를 관망할 수 있어야 하는데 이를 가능하게 하는 것이 바로 애그리거트입니다.
📌 애그리거트의 적용
애그리거트는 관련된 객체를 하나의 군, 집합으로 묶어주게 됩니다. 객체를 관련 있는 것들끼리 묶음으로써 전체적인 관점에서 서브 도메인들 간의 관계를 파악할 수 있게 됩니다.
📌 애그리거트의 특징
이러한 애그리거트는
- 모델을 이해하는데 도움을 줍니다.
- 일관성을 관리하는 기준이 됩니다.
- 이를 통해 복잡한 도메인을 단순하 구조로 만들어 줍니다.
- 한 개의 엔티티 객체만 갖는 경우가 많으며 두 개 이상의 엔티티로 구성되는 애그리거트는 매우 드뭅니다.
- 애그리거트는 독립된 객체 군이며 각 애그리거트는 자기자신을 관리할 뿐 다른 애그리거트는 관리하지 않습니다.
- ❗️주문 애그리거트는 배송지를 변경하거나 주문 상품의 개수를 변경하지만
- ❗️주문 애그리거트에서 회원의 개인정보를 변경하거나 상품의 가격을 변경하지 않는다.
- 관련한 모델을 하나로 모은 것이기 때문에 하나의 애그리거트에 속한 객체는 비슷하거나 동일한 라이프사이클을 갖습니다.
동일한 라이프사이클을 갖는 것이 굉장히 중요한 특징이라고 볼 수 있습니다.
예를 들어, 주문 애그리거트를 만들려면 Order, OrderLine, Orderer 와 같은 관련 객체들이 함께 생성되어야 합니다. Order는 생성했는데 Orderer, 주문한 사람이 없거나 ShippingInfo(배송지정보)가 생성되었는데 Order가 생성되지 않을 수는 없습니다. 도메인 규칙에 따라 일부 객체의 생성 시점이 뒤로 미루어질 수도 있지만 애그리거트의 구성 요소들은 보통 라이프 사이클을 함께합니다.
📌 애그리거트 경계 설정하는 법
애그리거트의 경계를 설정할 때 기본이 되는 것은 도메인 규칙과 비즈니스의 요구사항입니다.
일반적으로 도메인 규칙에 따라 함께 생성되고 삭제되는 구성요소는 한 애그리거트에 속할 가능성이 매우 높습니다.
예를 들어, 주문할 상품 개수, 주문자, 배송지 정보 등은 주문을 완료하는 시점에 함께 생성되므로 한 애그리거트입니다. 또한 주문 상품 개수와 배송지를 함께 변경하기도 하므로 함께 변경되는 빈도가 높다면 한 애그리거트에 속할 가능성이 높습니다.
보통 A가 B를 포함하는 관계를 애그리거트 관계라고 보기도 하지만 이는 맞을 때도 있고 맞지 않을 때도 있습니다. Product 와 Review 경우 Product는 Review를 갖고 있는, 포함하는 관계이지만, Product 객체가 생성 되는 시점에 Review가 생성되는 것은 아닙니다. 또한 Product가 변경되지 않고 Review만 변경될 수도 있습니다.
또한, Product는 관리자가 수정 및 등록을 진행하고 Review는 일반 사용자가 수정 및 등록을 하는 주체입니다. Product 와 Review의 변경이 서로에게 영향을 주지 않기 때문에 이 둘은 서로 다른 애그리거트에 속한다고 볼 수 있습니다.
참고: DDD START!
'BackEnd > DDD' 카테고리의 다른 글
DDD란 무엇인가(2) - 도메인, 서브도메인, 바운디드 컨텍스트 등 (0) | 2022.12.04 |
---|---|
DDD란 무엇인가(1) (0) | 2022.10.23 |