티스토리 뷰

728x90
반응형

 

Aggregate란?

  • 도메인 주도 설계(DDD)에서 도메인 객체들의 논리적인 그룹을 의미한다.
  • 여러 개의 엔티티(Entity)와 밸류 오브젝트(Value Object)를 묶어서 하나의 일관성 있는 변경 단위로 관리하는 개념이다.
  • Aggregate 내부 객체들은 강하게 연관되어 있고, 외부에서는 Aggregate 전체를 하나의 단위로 다룬다.

 


 

 

Aggregate Root (애그리게이트 루트)

  • Aggregate 안에 있는 여러 객체 중에서 대표가 되는 핵심 객체를 Aggregate Root라고 한다.
  • 외부에서 Aggregate 내부 상태를 변경하거나 조회할 때는 항상 Aggregate Root를 통해서만 접근해야 한다.
  • Aggregate Root가 내부 객체에 대한 모든 일관성과 상태 변경을 관리한다.

 


 

Aggregate의 특징

  • 일관성 유지 단위: Aggregate 내에서는 비즈니스 규칙과 제약조건이 지켜져야 하고, 트랜잭션 경계도 Aggregate 단위로 관리된다.
  • 외부와의 경계: Aggregate 내부의 객체는 외부에 직접 노출되지 않고, 오직 Aggregate Root를 통해서만 접근 가능하다.
  • 복잡한 도메인 로직 캡슐화: 도메인 로직과 상태를 캡슐화해서 복잡성을 줄이고, 코드 유지보수를 쉽게 해준다.

간단한 예시

쇼핑몰에서 주문(Order) Aggregate를 생각해보면

  • Order가 Aggregate Root
  • 주문 항목(OrderItem), 결제 정보 등이 Aggregate 내부에 속한다.
  • 주문을 추가하거나 취소하는 모든 작업은 Order Aggregate Root를 통해 수행된다.

 

Kotlin으로 작성한 Aggregate 예시

// Aggregate Root: 주문(Order)
class Order(
    val id: Long,
    val customerId: Long,
    private val items: MutableList<OrderItem> = mutableListOf()
) {
    // 주문 항목 추가 (비즈니스 규칙 적용)
    fun addItem(productId: Long, quantity: Int) {
        val existingItem = items.find { it.productId == productId }
        if (existingItem != null) {
            existingItem.increaseQuantity(quantity) 
        } else {
            items.add(OrderItem(productId, quantity))
        }
    }

    // 주문 총액 계산
    fun getTotalPrice(): Double {
        return items.sumOf { it.getPrice() }
    }

    // 주문 취소 (배송 후 취소 불가)
    fun cancel() {
        if (isShipped()) {
            throw IllegalStateException("배송된 주문은 취소할 수 없습니다.")
        }
        // 취소 처리 로직
    }

    private fun isShipped(): Boolean {
        // 실제로는 배송 상태 조회
        return false
    }
}

// Aggregate 내부 엔티티: 주문 항목(OrderItem)
class OrderItem(
    val productId: Long,
    private var quantity: Int
) {
    fun increaseQuantity(amount: Int) {
        quantity += amount
    }

    fun getPrice(): Double {
        // 상품 가격 조회 예시
        val pricePerUnit = 1000.0
        return pricePerUnit * quantity
    }
}

 

코드 설명

  • Order 클래스가 Aggregate Root 역할
    • items 리스트 안에 여러 OrderItem 엔티티를 포함
    • addItem 함수는 Aggregate 내부 상태를 변경하는 비즈니스 로직
      • 같은 상품이 이미 있으면 수량만 늘리고, 없으면 새 항목 추가
    • cancel 함수는 주문 취소 관련 비즈니스 규칙을 구현 (배송된 주문은 취소 불가)
    • 외부에서는 Order를 통해서만 내부 OrderItem에 접근하거나 조작할 수 있음.
  • OrderItem 클래스는 Aggregate 내부에 포함된 엔티티
    • 수량 변경, 가격 계산 등의 메서드를 가짐.
    • 직접 외부에서 생성하거나 조작하는 게 아니라, Aggregate Root인 Order를 통해 관리

핵심 포인트

  • Aggregate Root인 Order를 통해서만 주문 상태를 변경하도록 해서
  • 내부 객체인 OrderItem들의 상태 변경이 일관되게 유지되도록 한다.
  • Aggregate는 도메인 모델의 복잡한 규칙과 상태를 하나의 단위로 묶고 관리하는 역할을 한다!
728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형
250x250