1) 애그리거트가 왜 필요한가?
- 온라인 쇼핑몰 시스템을 개발할 때 상위 수준 개념을 이용해서
전체 모델을 정리하면 전반적인 관계를 이해하는데 도움이 된다.
- 백 개 이상의 테이블을 한 장의 ERD에 모두 표시하면,
개별 테이블 간의 관계를 파악하느라 큰 틀에서 데이터 구조를 이해하는데 어려움을 겪게 되는 것처럼,
도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고
전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워진다.
- 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은
코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다.
상위 수준에서 모델이 어떻게 엮여 있는지 알아야
전체 모델을 망가뜨리지 않으면서 추가 요구사항을 모델에 반영할 수 있는데,
세부적인 모델만 이해한 상태로는 코드를 수정하는 것이 꺼려지기 때문에
코드 변경을 최대한 회피하는 쪽으로 요구사항을 협의하게 된다.
꼼수를 부려 당장 돌아가는 코드를 추가할 수는 있지만
이런 방법은 장기적으로 코드를 더 수정하기 어렵게 만든다.
- 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면
상위 수준에서 모델을 조망할 수 있는 방법이 필요한데,
그 방법이 바로 애그리거트다.
애그리거트는 관련된 객체를 하나의 군으로 묶어준다.
수많은 객체를 애그리거트로 묶어서 바라보면 상위 수준에서
도메인 모델 간의 관계를 파악할 수 있다.
2) 애그리거트의 특징
- 애그리거트는 모델을 이해하는 데 도움을 줄 뿐만 아니라
일관성을 관리하는 기준도 된다.
모델을 보다 잘 이해할 수 있고, 애그리거트 단위로 일관성을 관리하기 때문에
애그리거트는 복잡한 도메인을 단순한 구조로 만들어준다.
복잡도가 낮아지는 만큼 도메인 기능을 확장하고 변경하는데 필요한 노력도 줄어든다.
- 애그리거트는 관련된 모델을 하나로 모았기 때문에
한 애그리거트에 속한 객체는 유사하거나 동일한 라이프사이클을 갖는다.
주문 애그리거트를 만들려면
Order, OrderLine, Orderer와 같은 관련 객체를 함께 생성해야 한다.
- Order는 생성했는데 ShippingInfo는 만들지 않거나
ShippingInfo를 생성하면서 Orderer를 생성하지 않는 경우는 없다.
도메인 규칙에 따라 최초 주문 시점에 일부 객체를 만들 필요가 없는 경우도 있찌만
애그리거트에 속한 구성요소는 대부분 함께 생성하고 함께 제거한다.
- 애그리거트는 경계를 갖는다.
한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.
애그리거트는 독립된 객체 군이며 각 애그리거트는 자기 자신을 관리할 뿐
다른 애그리거트를 관리하지 않는다.
- 예를 들어, 주문 애그리거트는
배송지를 변경하거나 주문 상품 개수를 변경하는 등 자기 자신을 관리하지만
주문 애그리거트에서 회원의 비밀번호를 변경하거나 상품의 가격을 변경하지는 않는다.
- 경계를 설정할 때 기본이 되는 것은 도메인 규칙과 요구사항이다.
도메인 규칙에 따라 함께 생성되는 구성요소는 한 애그리거트에 속할 가능성이 높다.
예를 들어, 주문할 상품 개수, 배송지 정보, 주문자 정보는 주문 시점에 함께 생성되므로
이들은 한 애그리거트에 속한다.
- 또한 OrderLine의 주문 상품 개수를 변경하면 도메인 규칙에 따라
Order의 총 주문 금액을 새로 계산해야 한다.
사용자 요구사항에 따라 주문 상품 개수와 배송지를 함께 변경하기도 한다.
이렇게 함께 변경되는 빈도가 높은 객체는 한 애그리거트에 속할 가능성이 높다.
'도메인 주도 개발 시작하기' 카테고리의 다른 글
[도메인 주도 개발 시작하기] 애그리거트의 영속성 전파 (0) | 2025.01.14 |
---|---|
[도메인 주도 개발 시작하기] 애그리거트 로딩 전략 (0) | 2025.01.14 |
[도메인 주도 개발 시작하기] 바운디드 컨텍스트 (0) | 2025.01.14 |
[도메인 주도 개발 시작하기] 엔티티와 밸류 (0) | 2025.01.07 |
[도메인 주도 개발 시작하기] 도메인 모델 패턴 (0) | 2025.01.07 |