1. 트랜잭셔널 아웃박스 패턴 소개
- 분산 시스템에서 데이터베이스 트랜잭션과 메시지 발행을 원자적으로 처리하는 것은 까다로운 문제입니다.
- 트랜잭셔널 아웃박스 패턴은 이 문제를 해결하기 위한 효과적인 방법을 제시합니다.
1.1 패턴의 핵심 개념
- 트랜잭셔널 아웃박스 패턴의 핵심은 메시지나 이벤트를 즉시 외부 시스템으로 발행하지 않고, 데이터베이스 트랜잭션의 일부로 outbox 테이블에 저장하는 것입니다.
- 이후 별도의 프로세스가 이 테이블을 모니터링하여 메시지를 실제로 발행합니다.
기본 구조
CREATE TABLE outbox
(
id UUID PRIMARY KEY,
aggregate_type VARCHAR(255),
aggregate_id VARCHAR(255),
event_type VARCHAR(255),
payload JSONB,
created_at TIMESTAMP,
published BOOLEAN DEFAULT FALSE
);
2. 패턴 구현 방식
2.1 트랜잭션 처리 과정
- 비즈니스 로직 실행과 동시에 outbox 테이블에 이벤트 저장
- 동일한 트랜잭션 내에서 두 작업이 원자적으로 처리
- 트랜잭션 성공 시 이벤트가 안전하게 저장됨을 보장
예시 코드
@Transactional
public void createOrder(Order order) {
// 주문 저장
orderRepository.save(order);
// outbox 테이블에 이벤트 저장
OutboxEvent event = new OutboxEvent(
"Order",
order.getId(),
"OrderCreated",
convertToJson(order)
);
outboxRepository.save(event);
}