Spring 트랜잭션 동기화로 레거시 알림톡 발송 시스템 한계 넘어서기
올리브영이 TransactionSynchronizationManager를 활용해 레거시 알림톡 발송 시스템을 Kafka 기반 이벤트 주도 아키텍처로 전환하여 트랜잭션 정합성 확보 및 알림톡 추가 공수를 낮춤
AI 요약
Context
올리브영의 알림톡 발송 시스템은 1,600만 명 이상의 회원에게 주문·결제·배송 관련 알림을 발송하는 핵심 채널이었으나, 비즈니스 성장에 따라 레거시 구조의 복잡도가 증가했다. 알림톡 발송 로직이 여러 비즈니스 코드에 산재되어 있고, 서비스별로 다른 테이블과 조건으로 데이터를 조회하면서 일관성이 깨졌으며, 발송 플랫폼 변경으로 인한 수정이 필요했다. 또한 알림톡 발송이 비즈니스 로직 내에서 직접 호출되어 발송 후 비즈니스 오류 발생 시 실제 데이터 상태와 고객 알림 간 불일치 문제가 발생할 수 있었다.
Technical Solution
- 트랜잭션 동기화 메커니즘 도입: TransactionSynchronizationManager를 활용한 afterCommit 콜백을 구현하여 비즈니스 트랜잭션 커밋 후에만 Kafka 메시지 발행이 실행되도록 보장
- 메시지 기반 아키텍처로 전환: 레거시 시스템의 주문/배송 상태 변경 로직에서 Kafka 메시지 발행으로 변경하여 알림톡 발송을 비즈니스 로직에서 분리
- 배송 컨슈머 서비스 구축: MSA 환경의 Delivery Consumer에서 Kafka 메시지를 소비하여 모든 알림톡 발송 처리를 일원화
- 통합 데이터 조회 기준 확립: 배송 유형별(일반배송/오늘드림/픽업/선물하기)로 분류하여 같은 배송 유형 내에서 일관된 쿼리로 데이터 조회하도록 통합
- 공통 발송 API 통일: 배송 유형과 관계없이 실제 외부 알림 플랫폼으로 나가는 통로를 단일 API로 통일하여 발송 요청 표준화
- 재시도 로직 강화: 메시지 발행 실패 시 실패 로그를 DB에 저장하여 별도 재처리 구조 구축
Key Takeaway
분산 시스템 환경에서 단일 트랜잭션 경계를 넘어 여러 서비스에 걸친 비즈니스 흐름의 일관성을 유지하려면, 데이터 커밋 이후에만 이벤트 발행이 일어나도록 보장하는 트랜잭션 동기화 메커니즘이 필수적이며, 이를 통해 발송 기능을 비즈니스 로직에서 안전하게 분리할 수 있다.
실천 포인트
Spring 4.2 이상 버전을 사용할 수 있는 환경에서 @TransactionalEventListener를 적용하기 어려운 경우, TransactionSynchronizationManager의 registerSynchronization 메서드로 afterCommit 콜백을 등록하면 @TransactionalEventListener와 동일한 트랜잭션 정합성을 확보하면서도 레거시 시스템의 의존성 버전 충돌을 피할 수 있다.