💻 프로젝트/Ku:room
이메일 인증 기능 @Async 비동기 처리
미미누
2025. 2. 8. 22:38
✔️ 이메일 전송 기능에서 비동기를 도입하였다.
이메일 전송 로직에서 JavaMailSender를 이용하고 있는데, 메일 지연 전송 시간이 많이 든다는 단점이 있다.
아래 내용과 같이 대략 9.65s가 소요된다.
✔️ 이메일을 보내는 과정 자체를 쓰레드가 기다리는 것이 아니라 요청을 보내고 쓰레드는 다른 작업을 수행하도록 변경하였다.
✔️ AsyncConfig
@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();
}
}
- executor.setCorePoolSize: 실행 대기 중인 Thread 의 개수
- executor.setMaxPoolSize: 동시에 동작하는 최대 Thread의 개수
- executor.setQueueCapacity: corePool의 크기를 넘어서면 큐에 저장하는데, 큐의 최대 용량
✔️ MailService
public void sendEmail(String toEmail,
String title,
String text) {
SimpleMailMessage emailForm = createEmailForm(toEmail, title, text);
try {
emailSender.send(emailForm);
} catch (RuntimeException e) {
log.debug("메일 서버에서 메일 전송 중, 오류가 발생했습니다. toEmail: {}, " +
"title: {}, text: {}", toEmail, title, text);
throw new MailSendException(MAIL_SEND_EXCEPTION, e.getMessage());
}
}
@Async
public void sendCodeToEmail(final MailSendRequest mailSendRequest) {
validateDuplicateEmail(mailSendRequest.email());
String title = MAIL_SEND_INFO.getTITLE();
String authCode = this.createCode();
sendEmail(mailSendRequest.email(), title, authCode);
storeAuthCode(mailSendRequest.email(), authCode);
}
- sendCodeToEmail 메서드를 이용해서 메일을 검증하고, 메일을 보낸다.
- storeAuthCode를 이용하여 Redis에 저장하고, 인증 메일 검증시 사용된다.
- 위 코드 처럼 @Async를 비동기를 적용하고자 하는 코드에 써주면 된다.
- 위 그림과 같이 9.65s -> 182ms로 줄어들었다.
참고
이메일 비동기로 보내기 (@Async)
회원가입을 할 때 이메일을 통해서 인증을 하고 있다. 하지만 SMTP는 외부서비스이며 실제로 굉장히 느리다. 처음 브라우저에서 버튼을 눌렀을 때 2~3 초동안 반응이 없었고 짧다면 짧은 순간이지
velog.io