점프 투 스프링부트의 비밀번호 찾기, 변경 기능을 개선하였습니다.
@DynamicUpdate
어노테이션을 추가하여 변경되는 속성만 update 쿼리 발생하도록 수정하였습니다.SpringBootApplication에서 @EnableAsync
어노테이션 사용
@SpringBootApplication
@EnableJpaAuditing
@EnableAsync // 비동기 기능 활성화
public class SnsFeedServiceApplication {
이후 @Async 명시만 하면 비동기 방식의 메서드 실행가능
@Async // 비동기
public void sendEmail(String email, String userName, String tempCode) {
SimpleAsyncTaskExecutor
사용**각 작업마다 새로운 스레드를 생성**
하고 비동기방식으로 동작@Configuration
@EnableAsync
public class AsyncConfig {
// core 사이즈 만큼 일 처리
// 기본 스레드가 처리할 수 있는 작업량 넘어설 경우 큐에서 대기
// 큐의 크기가 넘친다면 MaxSize 만큼 스레드 추가 생성
// -----------------------예시----------------------
// 5개로 작업 -> 20개인 큐에서 대기 -> 넘침 -> 30개로 늘림
// 큐에서 요청이 넘긴다면 RejectExecutionException 발생 -> CallerRunsPolicy 처리
// 요청한 Caller Thread에서 직접 처리
@Bean(name = "taskExecutor1")
public ThreadPoolTaskExecutor executor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5); // 스레드 풀에 속한 기본 스레드 개수
taskExecutor.setQueueCapacity(20); // 이벤트 대기 큐 크기
taskExecutor.setMaxPoolSize(30); // 최대 스레드 개수
taskExecutor.setThreadNamePrefix("Executor-");
// ThreadPoolExecutor.CallerRunsPolicy()는 RejectedExecutionHandler 인터페이스의 구현체
// 작업 큐가 가득 차서 더 이상 새로운 작업을 받아들일 수 없을 때의 정책을 정의합니다.
// 이 정책에 따르면, 작업 큐가 가득 찼을 때 새로 들어온 작업은 작업을 요청한 쓰레드에서 직접 처리
// 밑에 구현체 때문에 5개 스레드 꽉참 -> 큐 대기 -> 큐 꽉참 -> 30개 쓰레드 활용 -> 그래도 큐 꽉참 일때
// 예외가 발생하는데, 이때 예외 처리를 담당한다. 예외 시 이 작업을 요청한 스레드에서 직접 처리하도록
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
taskExecutor.setWaitForTasksToCompleteOnShutdown(true); // shutdown시 queue에 남아있는 모든 작업이 완료된 후 shutdown!
taskExecutor.setAwaitTerminationSeconds(60); // shutdown 최대 60초 대기
return taskExecutor;
}
}
해당 name의 Task를 스레드풀로 사용하겠다
는 의미 @Async("taskExecutor1")
public void sendEmail(String email, String userName, String tempPW) {
// 테스트를 위해 @test.com인 이메일은 발송하지 않음
if (email.endsWith("@test.com"))
return;
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(email);
message.setFrom(ADMIN_ADDRESS);
message.setSubject(userName + "님의 임시비밀번호 안내 메일입니다.");
message.setText("안녕하세요 " + userName + "님의 임시 비밀번호는 [" + tempPW + "] 입니다.");
mailSender.send(message);
}
@SpringBootApplication
@EnableJpaAuditing // @EntityListeners(AuditingEntityListener.class) 가 작동하도록 허용
@EnableAsync // 비동기 기능 활성화
public class SpringAdditionalApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAdditionalApplication.class, args);
}
}
Executor-
정상 동작 확인 ㅎㅎ