: 애그리거트를 사용하면 서비스 모델을 이해하는 데 도움을 준다.
: 예를 들어 온라인 쇼핑몰 시스템을 개발할 때, 상위 수준 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해하는 데 도움이 된다.
: 다음과 같은 그림이 있다고 할 때,
: 우리는 주문이 회원, 상품, 결제와 관련이 있다는 것을 쉽게 파악할 수 있다.
: 이를 개별 객체 단위로 다시 그려보면 다음과 같다.
: 상위 모델에 대한 이해 없이 객체 개별 수준 관점에서 상위 수준의 개념을 파악하려면 더 오랜 시간이 걸린다. 더 많은 코드를 보고 더 많은 전문가와 대화를 나눠야 비로소 상위 수준에서 모델 간의 관계가 이해되기 시작한다.
: 백 개 이상의 테이블을 한 장의 ERD에 모두 표시하면 개별 테이블 간의 관계를 파악하느라 큰 틀에서 데이터 구조를 이해하는 데 어려움을 겪게 되는 것처럼, 도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기가 어려워진다.
: 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경, 확장하는 것이 어려워진다는 것을 의미하며 장기적으로 유지보수에 큰 폐를 끼친다.
: 복잡한 도메인을 이해하고 관리하기 쉽게 하려면 상위 수준에서 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데 이것이 바로 애그리거트, 2장에서 설명했듯 애그리거트는 관련된 객체를 하나의 군으로 묶어주며 수많은 객체를 애그리거트로 묶어서 바라보면 상위 수준에서 도메인 모델 간의 관계를 파악할 수 있다.
: 애그리거트는 모델을 이해하는 데 도움을 줄 뿐만 아니라 일관성을 관리하는 기준도 된다.
: 모델을 보다 잘 이해할 수 있고 애그리거트 단위로 일관성을 관리하기 때문인데, 애그리거트는 복잡한 도메인을 단순한 구조로 만들어준다.
: 복잡도가 낮아지는 만큼 도메인 기능을 확장하고 변경하는 데 필요한 노력도 줄어든다.
: 애그리거트는 관련된 모델을 하나로 묶었기 때문에 한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다. 주문 애그리거트를 만들기 위해 우리는 Order, OrderLine, Orderer와 같은 관련 객체들을 함께 생성해야 한다.
: 애그리거트는 경계를 갖는다.
: 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다. 애그리거트는 독립된 객체 군이며 각 애그리거트는 자기 자신을 관리할 뿐 다른 애그리거트를 관리하지는 않는다.
: 즉 책임의 경계선이 그어지는 것, 주문 애그리거트는 배송지를 변경하거나 주문 상품 개수를 변경하는 등 자기 자신은 관리하지만 주문 애그리거트에서 회원의 비밀번호나 정보를 수정하지는 않는다.
⇒ 경계를 설정할 때 기본이 되는 것은 도메인 규칙과 요구사항이다. 도메인 규칙에 따라 함께 생성되는 구성요소는 한 애그리거트에 속할 가능성이 높다. 예를 들어 주문할 상품의 개수, 배송지 정보, 주문자 정보는 주문 시점에 함께 생성되므로 이들은 한 애그리거트에 속한다. 또한 OrderLine의 주문 상품 개수를 변경하면 도메인 규칙에 따라 Order의 총 주문 금액을 새로 계산해야 한다. 사용자 요구사항에 따라 주문 상품 개수와 배송지가 함께 변경되기도 한다. 이렇게 함께 변경될 확률이 높은 객체들은 한 애그리거트에 속할 가능성이 높다.
: 흔히 ‘A가 B를 가진다’라는 설계에 따른 요구사항이 있다면 A와 B를 한 애그리거트에 묶어서 생각하기 쉬우나 주문의 경우 Order가 ShippingInfo와 Orderer를 가지므로 이는 어느 정도 타당해 보인다.
하지만 ‘A가 B를 갖는다’로 해석할 수 있는 요구사항이 있다고해서 무조건 그렇게 되는 것은 아니다. 좋은 예로 상품과 리뷰가 있는데, 상품 상세 페이지에 들어가면 상품 상세 정보와 함께 리뷰 내용을 보여줘야 한다는 요구사항이 있을 때 Product 엔티티와 Review 엔티티가 한 애그리거트에 속한다고 생각할 수 있다. 하지만 Product와 Review는 함께 생성되지 않고 함게 변경되지도 않는다. 게다가 Product를 변경하는 주체가 상품 담당자라면 Review를 변경하는 주체는 주로 고객이다.
: Review의 변경이 Product에 영향을 주지 않고 반대로 Product의 변경이 Review에 영향을 주지 않으므로 이 둘은 한 애그리거트에 속한다고 볼 수 없다.