Skip to content

구독 트랜잭션과 메일 발송 로직을 분리한다. - #299

Merged
bricksky merged 2 commits into
mainfrom
298
Feb 20, 2026
Merged

bricksky merged 2 commits into
mainfrom
298

Conversation

@bricksky

@bricksky bricksky commented Feb 2, 2026

Copy link
Copy Markdown
Member

PR 요약

1. 문제점 (AS-IS)

  • 비동기 호출 시점 문제: SubscribeService의 구독 트랜잭션 내에서 @Async를 통해 메일 발송을 직접 호출하고 있었습니다.
  • 경쟁 상태: DB 트랜잭션이 커밋되기 전, 메일 발송 스레드가 먼저 실행될 수 있는 구조였습니다.
  • 데이터 정합성 위배: 이로 인해 트랜잭션이 롤백되더라도 메일이 발송되어버리는 '유령 구독자' 문제가 발생했습니다.
  • 높은 결합도: 서비스 계층이 인프라 계층(MailSender)에 직접 의존하여 단일 책임 원칙을 위배하고 있었습니다.

2. 개선 방안 (TO-BE)

  • 이벤트 기반 분리: 서비스가 메일 로직을 직접 호출하는 대신, ApplicationEventPublisher를 통해 SubscribeCreatedEvent를 발행하도록 변경했습니다.
  • 트랜잭션 연동 리스너 도입: @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)을 적용했습니다.
  • 실행 시점 보장: 상위 트랜잭션이 확실히 커밋된 이후에만 리스너가 동작하여 메일 발송 로직을 비동기로 수행합니다.

3. 기대 효과

  • 데이터 정합성 확보: 트랜잭션 롤백 시 메일 발송을 원천 차단하여 '유령 구독자' 문제를 해결했습니다.
  • 결합도 해소: 비즈니스 로직과 후처리(알림) 로직의 의존성을 끊어 유지보수성을 높였습니다.
  • 확장성 증대: 추후 슬랙 알림, 통계 집계 등의 기능 추가 시, 기존 로직 수정 없이 새로운 리스너만 추가하면 됩니다.

@bricksky
bricksky requested a review from le2sky February 2, 2026 07:05
@bricksky bricksky self-assigned this Feb 2, 2026
@bricksky bricksky added the 프로덕트:매일메일 매일메일 코어 구현 및 개선 label Feb 2, 2026
@github-actions

github-actions Bot commented Feb 2, 2026

Copy link
Copy Markdown

Test Results

166 tests   165 ✅  7s ⏱️
 49 suites    1 💤
 49 files      0 ❌

Results for commit 3d782e2.

♻️ This comment has been updated with latest results.

@sonarqubecloud

sonarqubecloud Bot commented Feb 2, 2026

Copy link
Copy Markdown

@bricksky
bricksky merged commit 4c30bd6 into main Feb 20, 2026
3 checks passed
@bricksky
bricksky deleted the 298 branch February 20, 2026 07:21
@le2sky le2sky removed the 프로덕트:매일메일 매일메일 코어 구현 및 개선 label Mar 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

구독 트랜잭션과 메일 발송 로직을 분리한다.

2 participants