본문 바로가기
Spring

@Asnyc를 이용한 멀티 스레드

by yang sing 2023. 6. 8.

안녕하세요.

지난 포스팅에 이어서 이번에도 멀티 스레드에 대해서 포스팅을 하고자 합니다.

 

이번 포스팅에서는 지난 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