코드 저장소.

[Coffies Vol.02] 이메일 인증 비동기 처리 본문

포폴/Coffies Vol.02

[Coffies Vol.02] 이메일 인증 비동기 처리

slown 2023. 12. 20. 19:29

목차

1. 문제점

2. 해결하는 과정

3.해결 후 결과

 

1. 문제점

 

기존의 Coffies 프로젝트를 하면서 회원가입시 이메일인증을 하는 기능을 만들었는데 구글이메일이 외부 api다 보니깐 인증버튼을 누르면 2~3초간 있다가 인증메일이 보내져서 속도를 좀 더 개선을 하는 방법을 보다가 @Async를 활용해서 비동기 처리를 통해서 속도를 개선하는 방법으로 하기로 했다.

 

2. 해결하는 과정

해결하는 과정은 지극히 간단했다.

 

2-1.우선은 비동기 관련 클래스를 작성한다.

@EnableAsync
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2); // 기본적으로 실행 대기 중인 Thread 개수
        executor.setMaxPoolSize(10); // 동시에 동작하는 최대 Thread 개수
        executor.setQueueCapacity(500); // CorePool이 초과될때 Queue에 저장했다가 꺼내서 실행된다. (500개까지 저장함)
        // 단, MaxPoolSize가 초과되면 Thread 생성에 실패할 수 있음.
        executor.setThreadNamePrefix("async-"); // Spring에서 생성하는 Thread 이름의 접두사
        executor.initialize();
        return executor;
    }
}

 

위의 설정 코드를 설명하자면 이러하다.

  • setCorePoolSize: 기본적으로 실행 대기 중인 Thread 의 개수를 정의합니다.
  • setMaxPoolSize: 스레드 풀이 가질 수 있는 스레드의 최대 개수를 정의합니다. 만약 스레드 풀이 최대 개수에 도달하면, 더 이상 새로운 작업을 받아들이지 않습니다.
  • setQueueCapacity: 스레드 풀의 작업 대기열 크기를 설정합니다. 이 크기는 corePoolSize가 가득 차고, 더 이상 현재 스레드로 작업을 처리할 수 없을 때 대기하는 작업의 최대 개수입니다.
  • setThreadNamePrefix: 생성되는 스레드의 이름 접두사를 정의합니다. 이를 통해 디버깅이나 로깅에서 어떤 스레드가 작업을 처리하고 있는지 쉽게 식별할 수 있는데, 현재 예시처럼 작성하면 각 스레드의 이름이 async -1, async-2와 같이 설정됩니다.
  • initialize(): 스레드 풀을 초기화합니다. initialize()가 호출되면, 설정된 corePoolSize만큼의 스레드가 즉시 생성됩니다.

 

2-2.이메일 서비스 클래스에서 이메일 발송 메서드에 @Async어노테이션을 달아준다.

@Async
public String sendSimpleMessage(String to)throws MessagingException,UnsupportedEncodingException {
    MimeMessage message = createMessage(to);
    try{
        javaMailSender.send(message); // 메일 발송
    }catch(MailException es){
        es.printStackTrace();
        throw new IllegalArgumentException();
    }
    return ePw; // 메일로 보냈던 인증 코드를 서버로 리턴
}

 

3.해결 후 결과

 

어노테이션을 적용하기 전

어노테이션을 적용한 후

 

 

결과적으로 보면 4.33ms 에서 244ms로 속도가 대폭 향상된 모습을 볼 수 있다. 비동기 처리를 통해, 이메일 전송 작업이 메인 애플리케이션 스레드를 차단하지 않고 백그라운드에서 실행되기 때문이다. 이를 통해 애플리케이션의 응답성과 성능을 향상시킬 수 있었다.