한컴인스페이스

Outbox 패턴 기반 이벤트 캡처 모듈

2026.02 ~ 2026.04
라이브러리 설계 및 개발
JavaSpring BootSpring AOPMyBatisPostgreSQLJackson

외부망과 폐쇄망이 분리된 환경에서 두 망 간 유일한 통신 수단은 파일 기반 중계 서버입니다. 기존에는 Debezium CDC로 변경 이벤트를 캡처했으나, 서버·네트워크 불안정으로 Debezium replication slot이 반복적으로 깨지는 문제가 발생했습니다. PostgreSQL WAL은 무제한 저장되지 않으며 replication slot이 읽은 위치까지만 삭제를 지연하는데, slot이 깨져 재생성되면 이전 LSN 위치를 잃어버리고 그 사이 삭제된 WAL은 복구할 수 없어 전체 스냅샷부터 재수행해야 하는 구조적 취약점이 있었습니다. 이를 해결하기 위해 애플리케이션 레벨에서 AOP와 MyBatis 인터셉터로 이벤트를 캡처하는 Spring Boot 자동설정 라이브러리를 직접 개발하고 실무 프로젝트에 적용했습니다.

역할별 수행 내용

이벤트 캡처

  • MyBatis Executor 인터셉터로 INSERT/UPDATE/DELETE 자동 감지 — 비즈니스 코드 변경 없이 투명하게 이벤트 캡처
  • TransactionSynchronization.beforeCommit()으로 비즈니스 트랜잭션과 Outbox 저장을 같은 트랜잭션으로 처리해 이벤트 유실 방지
  • @OutboxDomain / @OutboxEvent 애노테이션으로 도메인·메서드 단위 캡처 여부 제어
  • DefaultOutboxConverter에서 password·token 등 민감 필드 자동 제외 후 Jackson 직렬화

배치 & 파일 생성

  • 시간(60초) + 건수(1000건) 이중 트리거 배치 스케줄러로 Outbox 테이블 폴링
  • FOR UPDATE SKIP LOCKED로 다중 인스턴스 환경에서 중복 처리 방지
  • seq_from ~ seq_to 범위를 JSON Gzip 파일(sync_{seqFrom}_{seqTo}_{timestamp}.json.gz)로 압축 생성 후 중계 서버 경로에 적재
  • 자정 배치로 7일 이상 된 SENT 레코드 자동 정리

루프 방지

  • ThreadLocal 기반 OutboxContext로 suppress 상태 관리 — 폐쇄망에서 수신한 데이터를 적용할 때 Outbox 재발행 차단
  • source 필드로 이벤트 출처 식별, 양방향 동기화 시 무한 루프 방지

주요 성과

  • Debezium replication slot 반복 장애 해소 — 애플리케이션 레벨 이벤트 캡처로 인프라 의존성 제거
  • 비즈니스 코드 무침투 설계 — 애노테이션 추가만으로 기존 서비스에 즉시 적용 가능
  • 트랜잭션 원자성 보장으로 이벤트 유실 0건 달성

관련 자료