Notice
Recent Posts
Recent Comments
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

개발지식 먹는 하마 님의 블로그

[내일배움캠프 77일차] 이메일 발송 흐름 리팩토링 본문

TIL

[내일배움캠프 77일차] 이메일 발송 흐름 리팩토링

devhippo 2025. 6. 13. 00:00

프로젝트 중 맡은 부분을 비롯해서 연관된 흐름을 한 번 점검하면서
개선이 필요한 점을 찾아 리팩토링 하였다. 

1. JOB 분리하기

  • 역할 분리
  • 추후 확장성
  • 배포 시, 유연한 실행

기존에는 1개의 Job에서 producer, consumer를 모두 수행하고 있었다.
위와 같은 부분을 고려하여 mailProducerJob, mailConsumerJob, mailRetryJob 이렇게 3개의 Job으로 분리하였다.

 

2. 데이터 정합성 보장

큐에 들어간 데이터에 대해서, 큐에서 빼서 쓸 때 해당 발송이 여전히 유효한지에 대한
데이터 정합성을 보장하기 위한 로직을 추가해주어야 했다.

발송이 유효하지 않게 되는 상황

큐에 들어간 데이터가 꺼내져서 실제 발송되기 전에

  • 유저가 받고 싶은 문제의 카테고리가 변경되는 경우
  • 메일 발송 요일이 변경된 경우
  • 구독을 취소한 경우

구독 정보 생성 시, 인증 코드를 기반으로 이메일 인증을 하기 때문에 이메일 주소에 대한 검증은 불필요하다.

 

정합성 보장을 위한 기존 로직 변경

위와 같은 상황에 대하여 발송할 데이터의 정합성을 보장하기 위해 기존 로직의 실행 순서를 변경하였다.

큐에 넣기 전 문제를 출제하는 과정을 큐에서 꺼낸 후로 실행 위치를 변경하였다.
이로 인해 큐에서 데이터를 뺀 후, 그에 담긴 QuizId를 기반으로 문제를 조회하는 과정이 불필요해지며 생략되었다.

또한 구독 정보 조회 후, 아래와 같은 검증 로직을 추가하였다.
메일 발송 요일과 탈퇴 여부에 대해 검증한다.

        if (!subscription.isActive() || !subscription.isTodaySubscribed()) {
            return null;
        }

문제 출제 시, 구독 정보의 카테고리를 기반으로 출제하기 때문에 유저가 받고 싶은 문제의 카테고리가 변경되는 경우에 대한
추가적인 검증 로직은 불필요하다.


리팩토링 결과

  • 조회 횟수 감소
  • 데이터 정합성 보장으로 신뢰도 상승
  • 문제 출제를 Consumer가 수행하도록 하며, 비동기 병렬 처리 도입 시 약간의 속도 단축이 예상됨