[ 8주차 과제 ] 대용량 트래픽&데이터 처리

2025. 5. 19. 21:55향해99 8기

1. 기존 문제점

  • 모든 로직이 한 트랜잭션 안에서 실행
    • 포인트 차감 ▶ 결제 저장 ▶ 주문 상태 변경 ▶ 주문 정보 전달
  • 부가 작업(주문 정보 전달)이 느리거나 실패하면
    → 결제 전체가 통째로 실패

2. 개선 방안: 핵심 VS 부가 로직 분리

  1. 핵심 로직(한 트랜잭션)
    • 유저 포인트 차감
    • 결제 정보 저장
    • 주문 상태 변경
  2. 부가 로직(트랜잭션 바깥, 비동기)
    • 결제 완료 이벤트 발행 (AFTER_COMMIT)
    • 이벤트 리스너에서 비동기로 주문 정보 전달
    • 알림톡 발송 등

핵심 결제에는 영향 없이, 부가 기능만 따로 실행하도록 분리

3. 새로운 고민: 분산 트랜잭션

  • 여러 서비스·트랜잭션을 동시에 실행하다가 하나라도 실패하면?
    → 전체를 원자적으로 롤백하는 건 거의 불가능
  • 해결 키워드:
    • 보상 트랜잭션(실패 시 역으로 처리)
    • 2PC(Two-Phase Commit)
    • SAGA 패턴(작업 단계를 쪼개고, 실패 시 보상 단계 실행)

4. 쿠폰 비동기 발급 예시

  1. 발급 요청 API
    • 응답으로 “발급 요청 ID”만 돌려줌
  2. 별도 워커 스레드가 실제 발급 처리
  3. 상태 조회 API로 클라이언트가 발급 성공/실패 여부 확인

“발급 완료”가 아니라 “요청 접수” → 나중에 상태 확인


이렇게 핵심만 짚으면,

  1. 중요 로직(결제) 과 2) 부가 로직(정보 전달·알림·쿠폰) 을 분리해 안정성을 높이고
  2. 분산 환경에서는 SAGA 같은 패턴을 고민해야 한다는 점이 한눈에 들어옵니다.