본문 바로가기
개발 방법론

바운디드 컨텍스트(Bounded Context)와 애그리게이트(Aggregate)의 차이

by 시니성 2023. 11. 13.

바운디드 컨텍스트(Bounded Context)란?

바운디드 컨텍스트는 도메인 주도 설계(DDD, Domain-Driven Design)에서 중요한 개념입니다.

이는 특정 도메인 모델이 적용되는 경계를 정의합니다. 바운디드 컨텍스트는 도메인의 일부분으로서, 도메인 모델의 용어와 규칙이 유효한 특정 '문맥' 또는 '경계'를 의미합니다. 각 바운디드 컨텍스트는 독립적인 도메인 모델을 가지며, 이를 통해 복잡한 시스템을 여러 개의 관리 가능한 부분으로 나눕니다.

애그리게이트(Aggregate)란?

애그리게이트는 도메인 모델 내의 객체 그룹으로, 일반적으로 엔티티(Entity)와 값 객체(Value Object)의 집합입니다.

애그리게이트는 하나의 루트 엔티티(Aggregate Root)를 중심으로 구성되며, 이 루트 엔티티를 통해 애그리게이트의 다른 부분에 접근합니다.

애그리게이트는 데이터 일관성과 무결성을 유지하는 경계를 제공하며, 트랜잭션 관리의 단위로 사용됩니다.

바운디드 컨텍스트와 애그리게이트의 주요 차이점

  1. 범위와 책임: 바운디드 컨텍스트는 더 큰 범위를 가지며 전체 도메인 모델의 일부를 구성합니다.
    반면, 애그리게이트는 특정 도메인 내의 객체 그룹으로, 데이터의 일관성과 무결성을 유지하는 데 초점을 맞춥니다.
  2. 적용 수준: 바운디드 컨텍스트는 시스템의 전체적인 구조와 통합 패턴을 정의하는 데 사용되는 반면, 애그리게이트는 도메인 모델 내에서 데이터와 행위를 관리하는 데 사용됩니다.
  3. 통신: 바운디드 컨텍스트 간의 통신은 종종 복잡하며, 통합 패턴(예: 안티코럽션 레이어, 공유 커널 등)을 통해 관리됩니다. 반면, 애그리게이트는 내부적으로 통신하며 외부 요소와의 직접적인 상호작용은 루트 엔티티를 통해서만 이루어집니다.

 

바운디드 컨텍스트와 애그리게이트 비교 <표>

 

기준 바운디드 컨텍스트 (Bounded Context) 애그리게이트 (Aggregate)
정의 특정 도메인 모델이 적용되는 경계를 정의하는 문맥.
복잡한 시스템을 관리 가능한 부분으로 나눔.
도메인 내의 객체 그룹.
하나의 루트 엔티티를 중심으로 구성되며, 데이터 일관성 유지.
범위와 책임 전체 도메인 모델의 일부를 구성.
시스템 구조와 통합 패턴을 정의.
데이터의 일관성과 무결성 유지에 초점.
트랜잭션 관리의 단위.
적용 수준 시스템의 전체적인 구조와 통합 패턴 정의. 도메인 모델 내에서 데이터와 행위 관리.
통신 바운디드 컨텍스트 간의 통신은 종종 복잡.
안티코럽션 레이어, 공유 커널 등의 통합 패턴 사용.
애그리게이트 내부적으로 통신.
외부 요소와의 상호작용은 주로 루트 엔티티를 통해 이루어짐.
사용 사례 도메인 간의 경계 설정, 문맥에 따른 모델링, 시스템 아키텍처의 부분적 정의. 객체 집합의 일관된 관리, 데이터 무결성 및 일관성 보장, 도메인 내 트랜잭션 관리.

가상 시나리오 및 예시 상황

시나리오

"Fit-Hub"라는 체육관 관리 플랫폼 개발을 예로 들어보겠습니다. 이 시스템에는 회원 관리, 예약 시스템, 피트니스 클래스 관리 등 여러 기능이 있습니다.

바운디드 컨텍스트 예시

  • 회원 관리 컨텍스트: 회원 정보, 등록, 인증 등을 관리합니다.
  • 예약 시스템 컨텍스트: 클래스 예약, 예약 변경, 취소 등을 관리합니다.
  • 클래스 관리 컨텍스트: 다양한 피트니스 클래스의 스케줄, 강사 배정 등을 관리합니다.

애그리게이트 예시

  • 회원 관리 컨텍스트 내의 애그리게이트: 회원(Member)이 루트 엔티티, 주소(Address), 회원권(Membership) 등이 하위 객체.
  • 예약 시스템 컨텍스트 내의 애그리게이트: 예약(Reservation)이 루트 엔티티, 예약 상세(ReservationDetail), 결제 정보(PaymentInfo) 등이 하위 객체.

예제 코드

// 회원 관리 컨텍스트의 애그리게이트
class Member(
    val id: MemberId,
    var name: String,
    var address: Address,
    var membership: Membership
) {
    fun updateAddress(newAddress: Address) {
        address = newAddress
    }

    fun renewMembership(newMembership: Membership) {
        membership = newMembership
    }
}

class Address(val street: String, val city: String, val zipCode: String)
class Membership(val type: String, val startDate: LocalDateTime, val endDate: LocalDateTime)

이 코드 예시에서 Member 클래스는 회원 관리 컨텍스트의 애그리게이트 루트 엔티티입니다. AddressMembership는 하위 객체로, Member를 통해 관리됩니다.

결론

바운디드 컨텍스트와 애그리게이트는 도메인 주도 설계에서 중요한 개념으로, 각각 시스템의 전체적인 구조와 개별 도메인 모델의 내부 구조를 정의하는 데 사용됩니다.

이들은 복잡한 시스템을 관리 가능한 부분으로 나누어 설계의 명확성과 유지보수성을 향상시키는 데 기여합니다.