본문 바로가기
개발 방법론

애그리게이트(Aggregate)의 이해와 예시 사례

by 시니성 2023. 11. 12.

애플리케이션 설계에 있어 '애그리게이트'는 도메인 주도 설계(Domain-Driven Design, DDD)의 핵심 패턴 중 하나입니다. 오늘은 이 중요한 개념을 살펴보고, 가상의 시나리오를 통해 실제 코드 예시로 적용해보겠습니다.

애그리게이트란 무엇인가?

애그리게이트는 관련된 객체들을 하나의 그룹으로 묶는 패턴입니다. 이 패턴의 목적은 복잡한 도메인 모델을 관리 가능한 단위로 캡슐화하고, 일관성을 유지하는 것입니다.

핵심 구성 요소

  1. Root Entity (루트 엔티티)
    • 애그리게이트의 진입 지점으로, 외부에서는 루트 엔티티를 통해서만 애그리게이트의 다른 객체에 접근할 수 있습니다.
    • 루트 엔티티는 전체 애그리게이트에 대한 일관성을 유지하는 역할을 합니다.
  2. Boundary (경계)
    • 애그리게이트는 명확한 경계를 가지고, 경계 안의 객체들은 서로 긴밀하게 연관되어 있습니다.
    • 경계 밖의 객체들은 루트 엔티티를 통해서만 애그리게이트와 상호작용할 수 있습니다.

장점

  • 일관성 유지: 루트 엔티티를 통해 상태 변경을 관리함으로써, 애그리게이트 내의 데이터 일관성을 보장할 수 있습니다.
  • 도메인 규칙 캡슐화: 복잡한 도메인 로직을 애그리게이트 내부에 숨겨, 외부의 영향으로부터 보호합니다.
  • 유지보수성 향상: 도메인 모델을 명확하게 구조화함으로써, 유지보수가 용이해집니다.

가상 시나리오: 온라인 쇼핑몰의 주문 처리

시나리오 개요

온라인 쇼핑몰에서 사용자는 여러 상품을 장바구니에 담고, 이를 통해 주문을 생성합니다. 주문 처리 과정에서는 주문 항목, 결제 정보, 배송 주소 등 여러 요소가 관련되어 있습니다.

애그리게이트 설계

이 시나리오에서 '주문(Order)' 애그리게이트를 생각해볼 수 있습니다. 주문 애그리게이트는 다음과 같은 구성 요소를 포함합니다:

  • Order (루트 엔티티)
  • OrderItem (엔티티)
  • PaymentInfo (Value Object)
  • ShippingAddress (Value Object)

Order 루트 엔티티는 주문의 전반적인 프로세스와 상태를 관리합니다. OrderItem은 주문된 상품의 정보를, PaymentInfoShippingAddress는 각각 결제 정보와 배송 주소를 나타냅니다.

예제 코드 (Java)

// Order 루트 엔티티
public class Order {
    private Long id;
    private List<OrderItem> items;
    private PaymentInfo paymentInfo;
    private ShippingAddress shippingAddress;
    // ... 기타 필드 및 메소드


}

// OrderItem 엔티티
public class OrderItem {
    private Long id;
    private String productName;
    private int quantity;
    private double price;
    // ... 기타 필드 및 메소드
}

// PaymentInfo 값 객체
public class PaymentInfo {
    private String cardNumber;
    private String cardHolderName;
    // ... 기타 필드 및 메소드
}

// ShippingAddress 값 객체
public class ShippingAddress {
    private String street;
    private String city;
    private String zipCode;
    // ... 기타 필드 및 메소드
}

이 코드는 간단한 주문 애그리게이트를 나타내며, Java를 사용하여 구현되었습니다. Order 클래스는 주문과 관련된 모든 정보와 행위를 캡슐화하고, 다른 클래스들은 주문의 구체적인 세부 사항을 나타냅니다.

결론

애그리게이트는 복잡한 도메인 로직을 관리하고, 시스템의 일관성을 유지하는 데 큰 도움이 됩니다. 특히, 도메인 주도 설계에서 중요한 역할을 하며, 이를 통해 유지보수성이 높고, 확장 가능한 애플리케이션을 구축할 수 있습니다. 위 예제처럼 실제 상황에 맞게 애그리게이트를 적용해보는 것은 매우 가치 있는 경험이 될 것입니다.