IT 개발에서 Aggregate 패턴과 Bulkhead 패턴은 모두 **마이크로서비스 아키텍처(MSA)**나 분산 시스템에서 자주 사용되는 **설계 패턴(Design Pattern)**입니다. 각각의 목적은 다르지만, 시스템 안정성과 응답 효율을 높이기 위한 공통 목표를 가집니다. 아래에서 자세히 설명드릴게요.
🧩 1. Aggregate 패턴
💡 개념
Aggregate 패턴은 **도메인 주도 설계(DDD: Domain-Driven Design)**에서 등장하는 개념으로, 데이터의 일관성과 변경 단위를 정의하기 위한 구조입니다. 즉, 관련된 엔터티(Entity)와 값 객체(Value Object)를 하나의 **집합(Aggregate)**으로 묶고, 그 집합의 일관성을 책임지는 루트 엔터티를 Aggregate Root라고 부릅니다.
⚙️ 구성 요소
- Aggregate Root: 외부에서 접근 가능한 유일한 진입점. (예:
Order) - Entities: 고유한 ID를 가진 객체들. (예:
OrderItem) - Value Objects: ID 없이 값만으로 구분되는 불변 객체. (예:
Money,Address)
📘 예시
class Order { // Aggregate Root
private Long id;
private List<OrderItem> items;
private Money totalPrice;
public void addItem(Product product, int quantity) {
items.add(new OrderItem(product, quantity));
recalculateTotalPrice();
}
}
→ Order는 OrderItem을 직접 관리하며, 외부에서는 Order를 통해서만 OrderItem에 접근 가능하도록 합니다.
이로써 데이터의 일관성과 트랜잭션 범위를 제어할 수 있습니다.
🚀 사용 목적
- 트랜잭션 경계를 명확히 하여 일관성을 보장
- 복잡한 도메인 모델을 모듈화하고 유지보수성을 향상
- 데이터 무결성 및 불변성을 유지
🧱 2. Bulkhead 패턴
💡 개념
Bulkhead(격벽) 패턴은 시스템 장애가 다른 부분으로 전파되지 않도록 격리하는 아키텍처 패턴입니다. 배의 격벽이 한 구획이 침수되어도 나머지가 영향을 받지 않도록 하는 원리와 같습니다.
MSA 환경에서 특정 서비스나 리소스가 장애를 일으켜도, 다른 서비스로의 영향이 최소화되도록 격리하는 전략을 말합니다.
⚙️ 구현 방식
- 스레드 풀 분리(Thread Pool Isolation) 각 서비스 호출마다 별도의 스레드 풀을 사용하여 하나의 서비스 장애가 전체 시스템을 블로킹하지 않도록 함.
- 커넥션 풀 분리(Connection Pool Isolation) 데이터베이스나 외부 API 접근 시 커넥션 풀을 격리하여 장애 전파 방지.
- 리소스 제한(Resource Quota) 특정 서비스나 요청 유형에 리소스 한도를 설정.
📘 예시 (Resilience4j 또는 Spring Cloud)
@Bulkhead(name = "paymentService", type = Bulkhead.Type.THREADPOOL)
public PaymentResponse callPaymentService(Order order) {
return paymentClient.pay(order);
}
→ paymentService 호출에 대한 스레드 풀을 분리하여, 장애 발생 시 다른 서비스(shippingService, inventoryService)는 영향받지 않습니다.
🚀 사용 목적
- 서비스 간 장애 격리 및 전파 방지
- 시스템 전체 안정성 확보
- 서킷 브레이커(Circuit Breaker)와 함께 사용 시 복원력 극대화
🔄 Aggregate vs Bulkhead 비교 요약
| 구분 | Aggregate 패턴 | Bulkhead 패턴 |
|---|---|---|
| 주요 영역 | 도메인 모델 설계 (DDD) | 시스템 아키텍처 / 인프라 |
| 초점 | 데이터 일관성, 트랜잭션 경계 | 장애 격리, 시스템 안정성 |
| 적용 위치 | 엔터프라이즈 도메인 로직 내부 | 서비스 간 호출, 리소스 관리 |
| 대표 구현 | Aggregate Root, Repository | Resilience4j, Hystrix, Istio 등 |
🧠 함께 사용되는 패턴들
- Aggregate는 보통 Repository, Factory, Specification 패턴과 함께 사용.
- Bulkhead는 Circuit Breaker, Retry, Rate Limiter와 함께 Resilience 패턴 세트로 활용.