Skip to content

[REFACTOR] 재고 로직의 카프카 직접 전송 제거 및 Outbox 이벤트 적재 #24

Description

@ji-circle

💡 리팩터링 대상 및 이유

재고 차감 및 복구 시 메시지 유실 없는 Kafka 이벤트 발행을 위해 Transactional Outbox 패턴을 도입하여, 로컬 DB 저장과 이벤트 발행 간의 원자성(데이터 정합성)을 보장

🔍 현재 코드 상태 (문제점)

현재 StockCommandService에선 카프카 메시지를 트랜잭션 외부에서 직접 전송하고 있음

  • reserveStockInternal: transactionTemplate.execute() 수동 커밋 직후 전송
  • restoreStockInternal: TransactionSynchronizationManager.afterCommit() 콜백 내에서 전송

-> 이로 인해 DB 커밋 직후 카프카가 다운되거나 네트워크 장애가 발생하면 메시지가 유실되는 치명적인 데이터 불일치 위험이 있음

✅ 체크리스트 (구현할 내용)

  • Inventory 전용 OutboxEvent 테이블 엔티티 및 Repository 구성
  • 기존 afterCommit 훅 및 트랜잭션 외부의 카프카 직접 발행(KafkaTemplate.send) 로직 제거
  • 순수 비즈니스 로직(재고 저장)이 실행되는 동일 트랜잭션 내부에서 이벤트(StockReservedEvent, StockRestoredEvent 등)를 PENDING 상태로 INSERT
  • 카프카 스케줄러 없이 PENDING 데이터가 정상 적재되는지 단위/통합 테스트 작성

🚀 기대 효과

카프카나 네트워크 장애 시에도 재고 변동 이벤트가 로컬 DB에 안전하게 보관되어 메시지 유실률 0%를 달성

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions