올리브영, Spring 트랜잭션 동기화로 레거시 알림톡 시스템을 MSA로 탈바꿈!
올리브영은 급증하는 비즈니스에 맞춰 레거시 알림톡 시스템의 확장성 한계(Scalability Bottleneck)를 인지하고, 모던 아키텍처로의 전환을 결정함
Spring의 @TransactionalEventListener 사용 불가로 인해, TransactionSynchronizationManager를 활용한 트랜잭션 커밋 후 콜백 방식 구현
Kafka 메시지 기반의 이벤트 주도 아키텍처(Event-Driven Architecture)로 전환하여 알림톡 발송 흐름을 비즈니스 로직에서 분리
데이터 조회 기준 통합 및 공통 발송 API 구축을 통해 유지보수성(Maintainability) 및 확장성(Scalability)을 확보함
MSA 환경에서의 알림톡 처리 흐름 이해를 통해, 시스템 설계(System Design)의 중요성을 강조함
Spring 트랜잭션 동기화 방식 비교
본문에서는 Spring의 @TransactionalEventListener를 사용하려 했으나, 레거시 환경의 제약으로 인해 TransactionSynchronizationManager를 활용한 트랜잭션 동기화를 구현했다.
@TransactionalEventListener: 트랜잭션 커밋 후 이벤트를 처리하는 방식으로, 이벤트 기반 아키텍처(Event-Driven Architecture) 구현에 적합
TransactionSynchronizationManager: 트랜잭션 커밋 이후 콜백 메서드를 실행하여, 데이터 정합성(Data Consistency)을 보장
트레이드오프: @TransactionalEventListener는 Spring 4.2 이상 지원, TransactionSynchronizationManager는 Spring 2.0부터 지원. 레거시 환경에서는 TransactionSynchronizationManager가 더 적합
결과적으로, 레거시 환경에서는 TransactionSynchronizationManager를 통해 트랜잭션 동기화(Transaction Synchronization)를 구현하고, MSA 환경에서는 @TransactionalEventListener를 활용하는 것이 일반적이다.
Kafka 메시지 기반 아키텍처 설계
올리브영은 레거시 시스템과 모던 아키텍처 간 통신을 위해 Kafka 메시지를 활용하여 이벤트 주도 아키텍처(Event-Driven Architecture)를 구축했다.
레거시 시스템: 주문/배송 상태 변경 시 Kafka 메시지 발행
MSA Delivery Consumer: Kafka 메시지를 소비하여 알림톡 발송 처리
장점: 결합도(Coupling) 감소 및 각 서비스의 독립적인 확장 가능
단점: 메시지 유실(Message Loss) 가능성 및 분산 시스템(Distributed System)의 복잡성 증가
메시지 발행 실패 시 DB에 실패 로그를 저장하고 재처리하는 구조를 통해 안정성을 확보했으며, Outbox Pattern을 추가 적용하여 안정성을 더욱 강화할 수 있다.
MSA 환경에서의 알림톡 처리 흐름
MSA 환경에서 알림톡 처리는 레거시 시스템과 Delivery Consumer 서비스 간의 역할 분담을 통해 이루어진다.
레거시 시스템: 트랜잭션 커밋 후 Kafka 메시지 발행 (발송 시점 결정)
Delivery Consumer: Kafka 메시지 소비, 알림톡 유형에 따라 배송 유형 분기, 공통 쿼리 및 템플릿 기반 발송 (발송 내용 및 방식 결정)
장점: 알림톡 추가 시 템플릿 및 발송 시점만 추가하면 되므로 확장성(Scalability) 및 유지보수성(Maintainability) 향상
고려사항: 서비스 간의 데이터 일관성(Data Consistency) 유지, 분산 환경에서의 장애 대응(Fault Tolerance) 전략 수립
결과적으로, MSA 환경에서는 각 서비스의 역할 분담을 통해 시스템의 유연성을 확보하고, 새로운 기능 추가에 대한 대응력을 높일 수 있다.
데이터 조회 기준 통합 및 공통 API 구축
올리브영은 알림톡 발송을 위해 서비스별로 흩어져 있던 데이터 조회 기준을 통합하고, 공통 발송 API를 구축하여 시스템의 효율성을 높였다.
기존 레거시 시스템: 서비스별로 다른 테이블과 조건으로 데이터 조회
개선된 시스템: 알림톡 유형에 따라 공통 쿼리를 사용하여 데이터 조회
장점: 데이터 일관성(Data Consistency) 확보, 유지보수 용이성 증대
공통 발송 API: 알림톡 템플릿 구성 및 발송 요청 처리
결과적으로, 데이터 조회 기준 통합 및 공통 API 구축을 통해 알림톡 발송 시스템의 유지보수성(Maintainability) 및 확장성(Scalability)을 향상시켰다.
MSA 전환 후 개선된 점 분석
올리브영은 레거시 시스템을 MSA로 전환한 후, 아키텍처 구조, 발송 시점 보장, 데이터 조회, 관리 주체, 확장성 측면에서 다양한 개선을 이루었다.
아키텍처 구조: 서비스 로직 내 발송 코드 결합(Monolithic) → Kafka 기반 이벤트 주도 아키텍처(EDA)
발송 시점 보장: 비즈니스 로직 결과와 별개로 발송 → afterCommit 활용 트랜잭션 정합성 확보
데이터 조회: 서비스별 산재된 테이블/조건 조회 → 통합 기준으로 일관된 데이터 조회
관리 주체: 각 비즈니스 도메인 서비스 → 배송 컨슈머(Delivery Consumer)로 일원화
확장성: 알림톡 추가 시마다 레거시 코드 수정/배포 → 템플릿 등록 및 메시지 발행으로 낮은 공수
결과적으로, MSA 전환을 통해 유지보수성(Maintainability), 확장성(Scalability), 유연성(Flexibility)을 모두 확보하고, 운영 안정성을 높였다.