프로젝트를 진행하다 보면 이메일 인증 기능을 자주 사용하곤 합니다.
그 과정에서 항상 들었던 의문점 중 하나는, 왜 이메일이 생각보다 늦게 올까?라는 생각이었습니다.
저는 이메일을 일괄 전송하는 기능을 구현해야 하다보니, 속도 부분을 개선해야 하는 점은 해결해야 하는 과제 중 하나였습니다.
이전에 다뤘던 SMTP를 더해서, 이번에는 이메일을 비동기로 전송해보는 부분에 대해서 다뤄보려고 합니다.
SMTP 구축에 대해서 궁금하신 분들은 아래 포스팅을 참고하시기 바랍니다.
https://hyunily.tistory.com/22
기존 방식 속도
기존 방식으로 이메일을 2명의 사용자에게 전달했을때, 걸리는 시간은 다음과 같습니다.
생각보다 느린 속도에 당황스럽네요...!!
비동기(@Async) 설정
이메일을 보내는건 외부서비스이지만, 이메일을 보내는 과정 자체를 스레드가 기다리게 하는 방식이 아닌,
요청은 보내고 스레드는 다른 처리를 하게 만든다면? 과 같은 생각을 해볼 수 있는데요.
그럼 이제 본격적으로 비동기 설정을 진행해 보겠습니다.
AsyncConfig.java
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
@Bean(name = "mailExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(10);
executor.setThreadNamePrefix("Async MailExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler();
}
}
@EnableAsync : 비동기 메서드를 사용할 수 있도록 활성화합니다.
이 클래스는 AsyncConfigurer 인터페이스를 구현하여 비동기 작업에 대한 설정을 합니다.
ThreadPoolTaskExecutor를 활용해서, 스레드 풀을 관리하는 객체를 생성합니다.
setCorePoolSize(2) : 스레드 풀의 기본 스레드 수를 2로 설정합니다.
-> 최소 2개의 스레드를 유지하고, 스레드 수는 동시 요청이 적을 때도 유지됩니다.
setMaxPoolSize(5) : 스레드 풀의 최대 스레드 수를 5로 설정합니다.
-> 동시 비동기 작업 요청이 많을 경우, 스레드 풀은 최대 5개의 스레드를 사용할 수 있습니다.
setQueueCapacity(10) : 스레드 풀이 사용할 큐의 크기를 10으로 설정합니다.
-> 동시 작업 요청이 많아 스레드를 즉시 사용할 수 없는 경우, 최대 10개의 요청이 대기열에 저장됩니다.
기존 email-send 코드에 @Async annotation 적용
결과 확인
기존에 25.91s 걸리던 이메일 전송 과정이 110ms로 줄어든 부분을 확인할 수 있습니다.
이렇게 스레드를 활용하여, 응답 속도를 개선시켜 보았습니다.
물론 이외에도, 1) Batch Processing 2) SMTP 서버 성능 최적화 3) 메시지 브로커 도입(Kafka) 4) 템플릿 캐싱 등등 더 도입해 볼 수 있는 방법이 있을 것으로 보입니다.
추후에 위에 언급한 방법에 대해서도 다뤄보고 더 개선시켜 보겠습니다.
'Daily' 카테고리의 다른 글
무중단 배포란? (0) | 2024.10.21 |
---|---|
[Spring Boot] 동시성 제어 (3) | 2024.10.12 |
VMware Ubuntu가상환경 Jenkins 설치 (3) | 2024.09.02 |
git pull error (0) | 2024.08.25 |
Mac M1 VMware + Ubuntu 설치 (0) | 2024.08.14 |