마이크로서비스 패턴 교재 정리
개념적으로도 모호하지만 경계가 분명하지 않으면 비즈니스 객체를 업데이트할 때 문제가 생길 수 있습니다. 비즈니스객체는 대부분 불변 값이 있고 필히 준수해야할 비즈니스 규칙이 있습니다. 예를 들어 Order 객체는 최소 주문량이라는 불변 값이 있어서 주문을 업데이트 할 때 이 값 이상의 양을 주문해야 합니다. 그런데 이 불변의 값을 강제하려면 비즈니스 로직을 주의 깊게 설계 해야 합니다.
애그리거트는 한 단위로 취급 가능한 경계 내부의 도메인 객체들입니다. 하나의 루트 엔터티와 하나 이상의 기타 엔터티 + 밸류 객체로 구성 되죠. 비즈니스 객체는 대부분 애그리거트로 모델링 합니다.
<aside> 💡 패턴: 애그리거트 도메인 모델을 여러 애그리거트로 구성한다. 각 애그리거트는 한 단위로 취급 가능한 객체망이다.
</aside>
예) Order 애그리거트와 그 경계. 하나의 Order 엔터티와 하나 이상의 OrderLineItem 밸류 객체, 그 밖의 DeliveryInfo, PaymentInfo 등의 밸류 객체로 구성됩니다. p)205
애그리거트는 도메인 모델을 개별적으로 이해하기 쉬운 덩어리(chunk)로 분해합니다. 또 로드, 수정, 삭제 같은 작업 범위를 분명하게 설정합니다. 작업은 애그리거트 일부가 아닌 전체 애그리거트에 적용합니다. 애그리거트는 보통 DB 에서 통째로 가져오기 때문에 복잡한 지연로딩 문제를 신경 쓸 필요가 없습니다. 그리고 애그리거트를 삭제하면 해당 객체가 DB에서 모두 사라집니다.
애그리거트는 일관된 경계
일부가 아니라 전체 애그리거트를 업데이트하므로 좀 전에 설명한 일관성 문제가 해소가 됩니다. 업데이트 작업은 애그리거트 루트에서 호출되기 때문에 불변 값이 강제되고, 동시성 역시 애그리거트 루트를 (버전 번호나 DB수준의 락으로) 잠금하여 처리합니다.
애그리거트를 식별하는 일이 관건