포폴/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로 속도가 대폭 향상된 모습을 볼 수 있다. 비동기 처리를 통해, 이메일 전송 작업이 메인 애플리케이션 스레드를 차단하지 않고 백그라운드에서 실행되기 때문이다. 이를 통해 애플리케이션의 응답성과 성능을 향상시킬 수 있었다.