Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- JPA
- 데이터 베이스
- Java
- docker
- 연습문제
- Til
- 프로그래머스
- 포트 폴리오
- LV0
- 디자인 패턴
- Spring Frame Work
- 네트워크
- LV1
- LV.02
- SQL
- LV02
- Join
- 알고리즘
- LV03
- 배열
- Lv.0
- 이것이 자바다
- jpa blog
- 포트폴리오
- LV01
- Redis
- CoffiesVol.02
- 일정관리프로젝트
- 코테
- mysql
Archives
- Today
- Total
코드 저장소.
[Coffies Vol.02] 이메일 인증 비동기 처리 본문
목차
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로 속도가 대폭 향상된 모습을 볼 수 있다. 비동기 처리를 통해, 이메일 전송 작업이 메인 애플리케이션 스레드를 차단하지 않고 백그라운드에서 실행되기 때문이다. 이를 통해 애플리케이션의 응답성과 성능을 향상시킬 수 있었다.
'포폴 > Coffies Vol.02' 카테고리의 다른 글
[Coffies Vol.02]Redis로 세션 불일치 상황에서의 세션 공유 (0) | 2024.06.19 |
---|---|
[CoffiesVol.02] Redis의 세션과 캐시 서버를 분리하기. (0) | 2024.06.12 |
[Coffies Vol.02]네이티브 쿼리 트러블 슈팅 (0) | 2023.07.23 |
JUnit & Mockito 기반 Spring 단위 테스트 코드 작성 (0) | 2023.06.05 |
[Coffies Vol.02]Jpa N+1 문제 (0) | 2023.05.16 |