바운디드 컨텍스트(Bounded Context)란?
바운디드 컨텍스트는 도메인 주도 설계(DDD, Domain-Driven Design)에서 중요한 개념입니다.
이는 특정 도메인 모델이 적용되는 경계를 정의합니다. 바운디드 컨텍스트는 도메인의 일부분으로서, 도메인 모델의 용어와 규칙이 유효한 특정 '문맥' 또는 '경계'를 의미합니다. 각 바운디드 컨텍스트는 독립적인 도메인 모델을 가지며, 이를 통해 복잡한 시스템을 여러 개의 관리 가능한 부분으로 나눕니다.
애그리게이트(Aggregate)란?
애그리게이트는 도메인 모델 내의 객체 그룹으로, 일반적으로 엔티티(Entity)와 값 객체(Value Object)의 집합입니다.
애그리게이트는 하나의 루트 엔티티(Aggregate Root)를 중심으로 구성되며, 이 루트 엔티티를 통해 애그리게이트의 다른 부분에 접근합니다.
애그리게이트는 데이터 일관성과 무결성을 유지하는 경계를 제공하며, 트랜잭션 관리의 단위로 사용됩니다.
바운디드 컨텍스트와 애그리게이트의 주요 차이점
- 범위와 책임: 바운디드 컨텍스트는 더 큰 범위를 가지며 전체 도메인 모델의 일부를 구성합니다.
반면, 애그리게이트는 특정 도메인 내의 객체 그룹으로, 데이터의 일관성과 무결성을 유지하는 데 초점을 맞춥니다. - 적용 수준: 바운디드 컨텍스트는 시스템의 전체적인 구조와 통합 패턴을 정의하는 데 사용되는 반면, 애그리게이트는 도메인 모델 내에서 데이터와 행위를 관리하는 데 사용됩니다.
- 통신: 바운디드 컨텍스트 간의 통신은 종종 복잡하며, 통합 패턴(예: 안티코럽션 레이어, 공유 커널 등)을 통해 관리됩니다. 반면, 애그리게이트는 내부적으로 통신하며 외부 요소와의 직접적인 상호작용은 루트 엔티티를 통해서만 이루어집니다.
바운디드 컨텍스트와 애그리게이트 비교 <표>
기준 | 바운디드 컨텍스트 (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
클래스는 회원 관리 컨텍스트의 애그리게이트 루트 엔티티입니다. Address
와 Membership
는 하위 객체로, Member
를 통해 관리됩니다.
결론
바운디드 컨텍스트와 애그리게이트는 도메인 주도 설계에서 중요한 개념으로, 각각 시스템의 전체적인 구조와 개별 도메인 모델의 내부 구조를 정의하는 데 사용됩니다.
이들은 복잡한 시스템을 관리 가능한 부분으로 나누어 설계의 명확성과 유지보수성을 향상시키는 데 기여합니다.
'개발 방법론' 카테고리의 다른 글
헥사고날 아키텍쳐(feat. 코틀린 멀티 모듈) (1) | 2023.11.20 |
---|---|
데이터베이스 트랜잭션이 둘 이상의 애그리거트 인스턴스를 수정하지 못하게 하라! (0) | 2023.11.12 |
비즈니스 요구사항 증가에 따른 애그리게이트 분리 (1) | 2023.11.12 |
바운디드 컨텍스트(Bounded Context)의 이해와 가상 적용 사례 (1) | 2023.11.12 |
애그리게이트(Aggregate)의 이해와 예시 사례 (0) | 2023.11.12 |