애그리거트?

애그리거트

  • 애그리거트는 관련된 객체를 하나의 그룹으로 묶어주는 단위
    • 주문(루트 애그리거트)
      • 주문서
      • 주문자
      • 주문배송정보
  • 이를 통해 복잡한 도메인 모델을 상위 수준에서 쉽게 이해하고 관리가 가능해진다.

개별 객체와 상위 수준의 모델의 관계성

  • 상세 모델의 복잡성의 문제
    • 개별 객체 단위로 모델을 바라보면,
    • 상위 수준에서의 관계를 파악하기 어려워진다.
      • 이는 코드 변경과 확장을 어렵게 만들며, 전체 모델을 이해하지 못한 상태에서의 코드 수정은 장기적으로 문제를 야기할 수 있습니다.
      • 예를 들어, 상위 수준에서 도메인 모델을 정리할 수 있다면, 주요 엔티티 간의 관계를 쉽게 파악할 수 있다.
        • 주문은
          • 회원, 상품, 결제와 관련이 있다는 것을 상위 수준의 모델에서 확인할 수 있다.

애그리거트의 생애주기

  • 객체의 라이프사이클
    • 한 애그리거트에 속한 객체들은 유사하거나 동일한 라이프사이클을 갖는다.
    • 예를 들어, 주문 애그리거트에 속한 객체들은 함께 생성되고 제거됩니다.
      • 주문자
      • 주문주소
      • 주문번호 밸류타입 등.

애그리거트 경계 중요성

  • 경계의 설정
    • 애그리거트는 각각 독립적임.
    • 각 애그리거트는 자신을 관리하고, 다른 애그리거트를 관리하지 않는다.
    • 도메인규칙등에 따라 달라질 수 있기에, 위 사항은 상황에 따라 다르긴함.

애그리거트의 크기 조정

  • 도메인에 대한 이해가 깊어질수록 애그리거트의 실제 크기는 줄어들며
  • 대부분의 애그리거트는 한 개의 엔티티 객체만을 갖는 경우가 많다고 한다.

Order

// 애그리거트 루트 엔티티
public class Order {
    private Long id;
    private String orderNumber;
    private List<OrderItem> items;

    public Order(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public void addItem(OrderItem item) {
        items.add(item);
    }

    // 주문에 대한 다른 비즈니스 로직들...
}

OrderItem

// 애그리거트에 속한 엔티티
public class OrderItem {
    private Long id;
    private String productName;
    private int quantity;
    private double price;

    public OrderItem(String productName, int quantity, double price) {
        this.productName = productName;
        this.quantity = quantity;
        this.price = price;
    }

    // 주문 항목에 대한 다른 비즈니스 로직들...
}

Uploaded by N2T