안녕하세요.
지난 포스팅에 이어서 이번에도 멀티 스레드에 대해서 포스팅을 하고자 합니다.
이번 포스팅에서는 지난 ThreadPoolTaskExecutor의 스레드 풀 설정과 @Asnyc 어노테이션을 이용한 비동기 멀티 스레드를 구현하고자 한다.
@Asnyc란
- @Asnyc는 Spring framework에서 제공해주는 기능으로 비동기 처리를 하고 싶은 메소드 위에 붙여서 사용하면 된다.
- 해당 어노테이션을 사용하기 위해서는 @EnableAsync을 필수적으로 같이 사용해줘야 한다.
- @Asnyc와 @EnableAsync는 Spring AOP의 하나로 AOP 제약 사항을 받는다.
1. ThreadPoolTaskExecutor 설정
- 이전 포스팅에서 작성해두었던 설정 파일을 그대로 가져와서 @EnableAsync 어노테이션을 추가
- 스레드 풀을 사용하지 않을 때에는 Application class에다 @EnableAsync를 추가
--> Application class에 @SpringBootApplication이 있고 스레드 풀을 사용하고자 한다면 스레드 풀 Config 파일에다가 사용을 해야한다.
@Configuration
@EnableAsync
public class TestThreadConfig {
@Bean
public TaskExecutor testThreadExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 스레드 풀에서 사용할 기본 스레드 개수
executor.setCorePoolSize(1);
// 스레드 풀에서 사용할 수 있는 최대 스레드 개수
executor.setMaxPoolSize(1);
// 스레드 풀에서 사용할 큐의 최대 크기
executor.setQueueCapacity(10);
// 반납된 스레드가 죽기까지 살아있는 시간
executor.setKeepAliveSeconds();
// 스레드명 프리픽스
executor.setThreadNamePrefix("TEST_Thread_");
executor.initialize();
return executor;
}
}
2. 비동기 메소드 작성
@Service
public class MessageService{
@Async
public sendMessage(){
...
메세지 발송 로직
...
}
}
3. 비동기 메소드 호출
@Service
public class TestService{
@Autowired
private MessageService messageService;
public testMethod(){
...
// MessageService의 비동기 메소드 sendMessage() 호출
messageService.sendMessage();
sendMessage_case1();
}
@Async
public sendMessage_case1(){
...
메세지 발송 로직
...
}
}
4. 결과
- 위 코드를 실행해보면 messageService.sendMessage()는 새로운 스레드가 생성이 되면서 비동기로 실행
- sendMessage_case1()의 경우 @Async 어노테이션을 사용을 했지만 testMethod가 실행되는 스레드가 그대로 실행
- @Async는 위에서 얘기 했듯이 AOP 제약을 따르는데 sendMessage_case1() java AOP의 Self-invocation의 영향으로 새로운 스레드가 생성이 되어 비동기로 실행이 되지 않고 기존에 testMethod가 실행되는 스레드로 실행이 된다.
이렇게 Spring의 @Async 어노테이션을 이용한 비동기 멀티 스레드에 대한 포스팅을 작성을 해봤다.
4번 결과에서 Self-invocation에 대해서는 다음 포스팅에서 더 자세하게 다뤄보도록 하겠다.
참고
https://goodgid.github.io/SpringBoot-Why-doesn't-it-work-with-Async/
'Spring' 카테고리의 다른 글
Spring AOP (0) | 2023.06.13 |
---|---|
Object Storage 이미지 출력 (0) | 2023.06.09 |
멀티 스레드 환경을 위한 스레드 풀 (Thread pool) - ThreadPoolTaskExecutor (0) | 2023.06.06 |
멀티 스레드 Runnable (0) | 2023.06.06 |
MyBatis (0) | 2023.06.04 |