노트

애그리거트

Aggregate

설계#architecture · 연결된 개념 7개

쉽게 말하면

애그리거트는 손목시계 같은 묶음이에요. 안쪽 톱니바퀴를 직접 돌리지 않고 용두 하나로만 조작하니까, 바늘끼리 어긋나는 일 없이 늘 맞는 시간을 지켜요.

비유가 깨지는 곳 시계는 통째로 한 덩어리지만, 실제 애그리거트끼리는 서로를 품지 않고 식별자로만 가리켜요. 여러 애그리거트에 걸친 변경은 이벤트로 이어 붙이고 최종 일관성을 받아들여요.

함께 일관성을 지켜야 하는 도메인 객체들의 묶음. 바깥에서는 묶음의 대표인 애그리거트 루트(Aggregate Root)를 통해서만 접근하고 변경한다. 도메인 주도 설계 (DDD)의 핵심 개념 중 하나다.

class Order { // 애그리거트 루트
  private items: OrderItem[] = []
  addItem(product: Product, qty: number) {
    if (this.status !== 'pending') throw new Error('확정된 주문은 바꿀 수 없다')
    this.items.push(new OrderItem(product, qty))
  }
}
// order.items[0].qty = 99 처럼 내부를 직접 고치지 않는다
  • 일관성 경계: "주문 총액은 항목 합계와 같다" 같은 불변식(invariant)은 애그리거트 안에서 항상 지켜진다. 루트가 모든 변경을 통제하기 때문이다
  • 트랜잭션 단위: 한 트랜잭션에서는 대개 한 애그리거트만 바꾼다. 여러 애그리거트에 걸친 변경은 이벤트로 이어 붙이고 최종 일관성(Eventual Consistency)을 받아들이는 경우가 많다(트랜잭셔널 아웃박스 패턴)
  • 다른 애그리거트는 식별자로 참조한다. 객체를 직접 물고 있으면 경계가 흐려진다
  • 리포지터리(Repository)도 애그리거트 단위로 둔다

JPA로 구현할 때는 루트에서 하위 엔티티로 영속성 전이(Cascade)를 거는 것이 자연스럽다. 묶음이 너무 크면 동시 수정 충돌과 조회 비용이 커지니 작게 유지한다. 내부를 숨긴다는 점에서 디미터 법칙, 컬렉션 캡슐화와 같은 생각이다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • JPQL과 @Query

    JPQL(Jakarta Persistence Query Language)은 테이블이 아니라 엔티티와 필드를 대상으로 쓰는 JPA의 객체 지향 쿼리 언어다. 실행할 때 연결된 DB의 SQL로 번역된다. Spring Data에서는 @Query로 리포지터리 메서드에 직접 붙인다.

  • ACID

    ACID는 DB 트랜잭션이 보장해야 할 네 가지 성질이다. 트랜잭션은 "계좌 이체의 출금 + 입금"처럼 함께 성공하거나 함께 실패해야 하는 논리적 작업 단위다.

  • 데코레이터 패턴

    같은 인터페이스를 구현한 래퍼로 객체를 감싸, 원래 객체를 고치지 않고 앞뒤에 기능을 덧붙이는 패턴. 래퍼를 여러 겹 쌓아 기능을 조합할 수 있다.

보기 옵션