개발지식 먹는 하마 님의 블로그
[내일배움캠프 78일차] 이메일 발송 흐름 성능 개선(비동기) 본문
MVP 개발로 인해 구조 개선이 필요했던 부분에 대한 리팩토링을 마쳤으니
이제 이전에 측정했던 성능 테스트 결과를 기반으로 개선을 해야 했다.
이전 테스트에서 이메일 발송 요청에서 병목 현상이 발생하였다.
https://devhippo.tistory.com/126
[내일배움캠프 76일차] 문제 풀이 링크 발송 테스트
MVP 방식 기반 1차 개발 완료MVP 기반으로 진행되는 프로젝트 개발 일정에 따라,이메일 발송 기능에 대한 초기 구현을 마쳤다.이제는 여러 부분을 테스트해 본 후, 성능 개선을 목적으로 2차 개발
devhippo.tistory.com
따라서, 이메일 발송 처리에 단계에서 비동기를 적용하는 작업이 필요하였다.
💡비동기 처리 도입
ThreadPoolExecutor 설정 및 적용
ThreadPoolExecutor는 자바에서 제공하는 표준 스레드 풀의 구현체이다.
java.util.concurrent.ThreadPoolExecutor
Spring은 자바에서 제공하는 ThreadPoolExecutor를 쉽게 사용할 수 있도록
ThreadPoolTaskExecutor 기능을 제공한다.
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("mail-step-thread-");
executor.initialize();
return executor;
}
ThreadPoolTaskExecutor를 다음과 같이 설정하고 이를 아래의 이미지와 같이 Consumer Job에 적용하였다.
각 이메일 발송 Task를 스레드 풀을 통해 병렬로 실행되도록 하여, 전체 배치 처리 시간이 단축된다.
인스턴스 환경에 따른 유의사항
현재 사용 중인 EC2 인스턴스는 t3.small로, vCPU가 1개인 환경이다.
이 때문에 CorePoolSize를 3으로 설정해도 실제로는 물리적으로 1개의 스레드만 동작하게 되어,
동기 처리와 비슷한 결과를 보이게 된다.
즉, 단순히 스레드 풀을 구성한다고 해서 항상 병렬 처리가 되는 것은 아니며,
인프라 성능에 따라 실제 병렬 처리 효과가 제한될 수 있다.
서비스 운영 시 더 나은 성능의 인스턴스로 변경할 계획이기 때문에, 그에 맞춰 스레드 수를 조정해야 한다.
테스트
위와 같은 이유로 비동기 처리 도입을 통한 성능 개선 효과는 로컬 환경(멀티코어 환경)에서 먼저 검증하였다.
✅ 1차 테스트
[테스트 환경]
발송 수단 : JavaMailSender
메일 서버 : Gmail-SMTP
데이터 개수 : 50개
스레드 개수 : 2개
개선 전 - 50개의 이메일을 발송할 때, 3분 소요
개선 후 - 50개의 이메일을 발송할 때, 1분 30초 소요
스레드 개수가 2개로 설정되어 있기 때문에 비동기 처리 시, 동기 처리 보다 2배가 빨리진 결과가 나왔다.
✅ 2차 테스트
[테스트 환경]
발송 수단 : JavaMailSender
메일 서버 : Gmail-SMTP
데이터 개수 : 100개
스레드 개수 : 4개
처리할 데이터 개수가 2배 증가하였으나, 이를 병렬로 처리할 스레드 개수도 2배 늘어났기 때문에 실행 시간이 매우 유사한 결과를 확인할 수 있다.
'TIL' 카테고리의 다른 글
전략 패턴과 팩토리 메서드 패턴 - 메일 발송 방식 변경 (0) | 2025.07.22 |
---|---|
[내일배움캠프 79일차] 트러블 슈팅 Throttle 예외 - RateLimiter 적용 (0) | 2025.06.16 |
[내일배움캠프 77일차] 이메일 발송 흐름 리팩토링 (0) | 2025.06.13 |
[내일배움캠프 76일차] 문제 풀이 링크 발송 테스트 (0) | 2025.06.11 |
[내일배움캠프 75일차] 메일 발송 MessageQueue 적용하기 (0) | 2025.06.10 |