티스토리 뷰
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
반응형
'프로그래밍 > 팁' 카테고리의 다른 글
🎯 서버 개발 시 예외 처리는 어떻게 해야 할까? CustomException이란? (0) | 2025.07.03 |
---|---|
POI에서 Double 타입 사용법: Kotlin DTO에서 Double 필드 Double? + @Field NotNull 조합으로 사용해야 하는 이유 (0) | 2025.07.02 |
API 설계 – 생성 후 어떤 응답을 반환할까? (ID vs DTO) (0) | 2025.07.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘
- Spring Security
- 그리디
- 22 정보처리산업기사
- hackerrank challenges
- 해커랭크 챌린지
- 소스코드
- 해커랭크 자바
- 정보처리 산업기사
- challenges
- ORM
- 백준
- 자바의 정석
- 해커랭크 자바 챌린지
- hackerrank
- 해커랭크
- 이코테
- 강의
- 코틀린
- 풀이
- JPA
- 디버깅
- Kotlin
- 정보처리산업기사 공부법
- 22 정보처리 산업기사
- 코드
- Java
- 정보처리산업기사
- 자바
- 챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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