프로젝트를 진행하다 보면 이메일 인증 기능을 자주 사용하곤 합니다.
그 과정에서 항상 들었던 의문점 중 하나는, 왜 이메일이 생각보다 늦게 올까?라는 생각이었습니다.
저는 이메일을 일괄 전송하는 기능을 구현해야 하다보니, 속도 부분을 개선해야 하는 점은 해결해야 하는 과제 중 하나였습니다.
이전에 다뤘던 SMTP를 더해서, 이번에는 이메일을 비동기로 전송해보는 부분에 대해서 다뤄보려고 합니다.
SMTP 구축에 대해서 궁금하신 분들은 아래 포스팅을 참고하시기 바랍니다.
https://hyunily.tistory.com/22
Spring Boot 회원가입 - 이메일(SMTP) 인증 구현하기
많은 서비스에서 회원가입 과정에 이제는 당연하다고 여겨지는 이메일 인증 기능을 구현해보려고 합니다. 구현에 앞서 프로젝트에 gradle 설정부터 진행하며 시작해 보겠습니다. build.gradle 설정
hyunily.tistory.com
기존 방식 속도
기존 방식으로 이메일을 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 |