💻 프로젝트/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로 줄어들었다. 

 

참고

https://velog.io/@injoon2019/%EC%9D%B4%EB%A9%94%EC%9D%BC-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%A1%9C-%EB%B3%B4%EB%82%B4%EA%B8%B0-Async

 

이메일 비동기로 보내기 (@Async)

회원가입을 할 때 이메일을 통해서 인증을 하고 있다. 하지만 SMTP는 외부서비스이며 실제로 굉장히 느리다. 처음 브라우저에서 버튼을 눌렀을 때 2~3 초동안 반응이 없었고 짧다면 짧은 순간이지

velog.io