Repository navigation
Conversation
| private void deleteUser(User user, Long userId) { | ||
| String nickName = user.getNickName(); | ||
| User.Provider provider = user.getProvider(); | ||
|
|
||
| user.softDelete(); | ||
| user.deletePersonalInfo(); | ||
| refreshTokenRepository.deleteByUserId(userId); | ||
|
|
||
| try { | ||
| notificationProvider.send( | ||
| new AccountDeleteNotificationMessage(userId, nickName, provider)); | ||
| } catch (Exception e) { | ||
| log.warn("[DeleteUserService] 회원 탈퇴 슬랙 알림 전송 실패. userId: {}", userId, e); | ||
| } | ||
| } | ||
|
|
There was a problem hiding this comment.
[MEDIUM] 회원 탈퇴 트랜잭션 내에서 동기 Slack 알림 호출
Problem: DeleteUserService는 클래스 레벨 @Transactional이 적용되어 있는데, deleteUser()에서 softDelete() / deletePersonalInfo() / refreshTokenRepository.deleteByUserId() 실행 직후 외부 Slack HTTP 호출(notificationProvider.send(...))을 같은 트랜잭션 안에서 동기적으로 수행합니다. Slack 응답 지연이 그대로 DB 커넥션 점유 시간에 더해져, 트래픽이 몰리는 시점에 커넥션 풀 고갈로 이어질 수 있습니다.
Evidence: 동일한 패턴이 회원가입 알림(PR #153)에서도 있었고, 당시 리뷰에서 동기식 외부 API 호출로 인한 성능/안정성 저하 문제로 지적된 뒤, 별도 후속 작업(이슈 #182, PR #183/#194 "slack 알림을 트랜잭션 비동기 처리")에서 @TransactionalEventListener(phase = AFTER_COMMIT) + @Async 조합으로 전환되었습니다. 이번 PR의 DeleteUserService.deleteUser() 113~128번째 줄은 try/catch로 알림 실패가 삭제 트랜잭션에 영향을 주지 않도록만 처리했을 뿐, 팀이 이미 확립한 비동기 처리 패턴은 적용하지 않았습니다.
Fix direction: 이미 온보딩 알림에 적용된 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + @Async 리스너 패턴을 재사용해, 탈퇴 처리와 Slack 알림 전송을 분리하는 것을 권장합니다. deleteUser()에서 notificationProvider.send(...)를 직접 호출하는 대신 ApplicationEventPublisher로 AccountDeletedEvent를 발행하고, 별도의 AccountDeleteNotificationListener에서 @Async + @TransactionalEventListener(phase = AFTER_COMMIT)을 사용해 알림을 비동기로 전송하도록 옮겨주세요.
There was a problem hiding this comment.
이번 PR에서는 현재 구현 유지
온보딩 완료 알림에 적용된 @TransactionalEventListener(phase = AFTER_COMMIT) + @Async 패턴으로 전환이 필요한 부분이라 회원가입 알림과 함께 별도 이슈/PR로 진행 예정
연관 이슈
작업 사항
feat(#198): 회원 탈퇴 API 구현feat(#198): 회원 탈퇴 시 Slack 알림 연동refactor(#198): 탈퇴 회원 재조회 방지 및 User 조회 로직 통합ReadUserService로 통합count()→countByDeletedFalse()로 변경하여 탈퇴 회원이 집계에서 제외테스트
주의 사항 및 참고사항