애그리거트 루트(Aggregate Root)

yul·2022년 8월 9일

애그리거트 루트는 애그리거트의 일관성을 지키는 수호자랄까?

주문(Order)과 주문 항목(OrderLine)을 생각해 보자.
주문 항목의 가격을 모두 합한 금액이 주문 금액이라고 할게. (도메인 제약 사항 공유)
그리고 주문이 저장될 때 주문 항목들도 함께 저장될 거고, 그 후 주문 항목만 개별적으로 삭제하거나 할 수 없다고 하자. (동일한 라이프 사이클)
그래서 둘을 한 애그리거트로 묶고 Order를 애그리거트 루트로 두었어. (물론 실무에서는 도메인에 따라 분리하는 게 맞을 수도)

Q. 왜 애그리거트에 루트라는 놈을 둔 거야?
A. 외부에서 이 애그리거트로 접근할 때 무조건 루트를 통하도록 할 목적이야.

Q. 루트를 통하도록 하는 이유는?
A. 루트를 통하지 않고 애그리거트 내부에 접근할 수 있으면 문제가 생길 수 있거든. 예를 들어서, OrderLine에 가격을 변경하는 기능이 있을 때, Order(루트)를 통하지 않고 OrderLine에 직접 접근해서 가격을 변경하는 일이 생기잖아? 그럼 OrderLine의 가격만 변하고 Order의 금액은 변하지 않아.
즉, "주문 항목의 가격을 모두 합한 금액이 주문 금액이다"라는 도메인 제약 사항 또는 일관성이 깨지는 거지.

어떻게 보면, 객체 내부 데이터를 private으로 숨기고 외부용 인터페이스만 public으로 두어 의도대로 동작하도록 통제하는 것과 비슷해.

0개의 댓글