💡 리팩터링 대상 및 이유
재고 차감 및 복구 시 메시지 유실 없는 Kafka 이벤트 발행을 위해 Transactional Outbox 패턴을 도입하여, 로컬 DB 저장과 이벤트 발행 간의 원자성(데이터 정합성)을 보장
🔍 현재 코드 상태 (문제점)
현재 StockCommandService에선 카프카 메시지를 트랜잭션 외부에서 직접 전송하고 있음
- reserveStockInternal: transactionTemplate.execute() 수동 커밋 직후 전송
- restoreStockInternal: TransactionSynchronizationManager.afterCommit() 콜백 내에서 전송
-> 이로 인해 DB 커밋 직후 카프카가 다운되거나 네트워크 장애가 발생하면 메시지가 유실되는 치명적인 데이터 불일치 위험이 있음
✅ 체크리스트 (구현할 내용)
🚀 기대 효과
카프카나 네트워크 장애 시에도 재고 변동 이벤트가 로컬 DB에 안전하게 보관되어 메시지 유실률 0%를 달성
💡 리팩터링 대상 및 이유
재고 차감 및 복구 시 메시지 유실 없는 Kafka 이벤트 발행을 위해 Transactional Outbox 패턴을 도입하여, 로컬 DB 저장과 이벤트 발행 간의 원자성(데이터 정합성)을 보장
🔍 현재 코드 상태 (문제점)
현재 StockCommandService에선 카프카 메시지를 트랜잭션 외부에서 직접 전송하고 있음
-> 이로 인해 DB 커밋 직후 카프카가 다운되거나 네트워크 장애가 발생하면 메시지가 유실되는 치명적인 데이터 불일치 위험이 있음
✅ 체크리스트 (구현할 내용)
🚀 기대 효과
카프카나 네트워크 장애 시에도 재고 변동 이벤트가 로컬 DB에 안전하게 보관되어 메시지 유실률 0%를 달성