Skip to content

[feat] SlackMessage DB저장 및 Kafka+Outbox 패턴 도입#141

Merged
S2hyeyunS2 merged 11 commits intodevfrom
feat/#135
Feb 11, 2026
Merged

[feat] SlackMessage DB저장 및 Kafka+Outbox 패턴 도입#141
S2hyeyunS2 merged 11 commits intodevfrom
feat/#135

Conversation

@S2hyeyunS2
Copy link
Collaborator

📍 PR 타입 (하나 이상 선택)

  • 기능 추가
  • 버그 수정
  • 리팩토링
  • 기타 사소한 수정

❗️ 관련 이슈 링크

Close #135


📌 개요

  • Slack 메시지 전송을 트랜잭션에서 분리하기 위해 Kafka + Outbox 패턴을 도입했습니다.
  • 도메인 이벤트 발생 시 즉시 Slack API를 호출하지 않고, Outbox에 저장 → Kafka 발행 → Consumer가 Slack 전송 흐름으로 비동기 처리되며, 실패 시 재시도(ExponentialBackOff) + DLQ로 안정성을 확보합니다.

🔁 변경 사항

1) Outbox 패턴 적용

  • SlackOutbox 엔티티/리포지토리 추가
  • SlackDomainEventHandler 로직 변경
    • 트랜잭션 커밋 전(BEFORE_COMMIT)에 Slack 전송 요청을 SlackOutbox 테이블에 저장하도록 수정

2) Kafka 연동 및 장애 대응 설정

  • KafkaConfig 추가 (Producer/Consumer 설정)
  • 재시도 정책: ExponentialBackOff 적용 (최대 10초, 2배씩 증가)
  • DLQ 처리: 전송 실패 시 .DLQ 토픽으로 보내도록 DeadLetterPublishingRecoverer 설정

3) Outbox Relay(Scheduler) 구현

  • SlackOutboxScheduler 구현
    • 1초마다 미발행 Outbox 메시지 조회 후 Kafka로 발행
    • 발행 성공 시에만 published 상태 업데이트하여 데이터 유실 방지

4) Kafka Consumer 구현

  • SlackMessageConsumer 구현
    • Kafka 메시지 수신 후 Slack SDK 호출로 실제 전송
    • 전송 성공/실패 결과에 따라 SlackMessage 상태 업데이트

📸 스크린샷

제목 스크린샷

👀 기타 더 이야기해볼 점


✅ 체크 리스트

  • PR 템플릿에 맞추어 작성했어요.
  • 변경 내용에 대한 테스트를 진행했어요.
  • 프로그램이 정상적으로 동작해요.
  • PR에 적절한 라벨을 선택했어요.
  • 불필요한 코드는 삭제했어요.

Removed unused transaction annotations from SlackDomainEventHandler.
@S2hyeyunS2 S2hyeyunS2 merged commit 9a63693 into dev Feb 11, 2026
1 check passed
@S2hyeyunS2 S2hyeyunS2 deleted the feat/#135 branch February 12, 2026 08:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] SlackMessage DB저장 및 Kafka+Outbox 패턴 도입

1 participant