@Async 어노테이션은 Spring에서 제공하는 Thread Pool을 활용하는 비동기 메소드 지원 어노테이션이다.
기존 Java에서 비동기 방식으로 메소드를 구현할 때는 아래와 같이 구현할 수 있었다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class GillogAsync {
static ExecutorService executorService = Executors.newFixedThreadPool(5);
public void asyncMethod(final String message) throws Exception {
executorService.submit(new Runnable() {
@Override
public void run() {
// do something
}
});
}
}
java.util.concurrent.ExecutorService를 활용해서 비동기 방식의 Method를 정의 할때마다, 위와 같이 Runnable의 run()을 재구현해야 하는 등 동일한 작업들의 반복이 잦았음
@Async 어노테이션을 활용하면 손쉽게 비동기 메소드 작성이 가능하다.
만약 Spring Boot에서 간단히 사용하고 싶다면, 단순히 Appliaction Class에 @EnableAsync 어노테이션을 추가하고
@EnableAsync
@SpringBootApplication
public class SpringBootApplication{
...
}
비동기로 작동하길 원하는 Method 위에 @Async 어노테이션을 붙여주면 사용할 수 있다.
public class YshAsync{
@Async
public void asyncMethod(String message) throws Exception{
...
}
}
위와 같은 사용은 간단하지만 @Async의 기본설정인 SimpleAsyncTaskExecutor를 사용한다.
본인의 개발환경에 맞게 커스터마이즈하기에는 직접 AsyncConfigurerSupport를 상속받는 Class를 작성하는 것이 좋다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
@Value("${thread.pool.task.executor.setCorePoolSize}")
private int CORE_POOL_SIZE;
@Value("${thread.pool.task.executor.setMaxPoolSize}")
private int MAX_POOL_SIZE;
@Value("${thread.pool.task.executor.setQueueCapacity}")
private int QUEUE_CAPACITY;
@Value("${thread.pool.task.executor.setThreadNamePrefix}")
private String THREAD_NAME_PREFIX;
@Override
public Executor getAsyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(CORE_POOL_SIZE);
executor.setMaxPoolSize(MAX_POOL_SIZE);
executor.setQueueCapacity(QUEUE_CAPACITY);
executor.setThreadNamePrefix(THREAD_NAME_PREFIX);
executor.initialize();
return executor;
}
}
여기서 설정한 요소들은 아래와 같다.
| 요소 | 설명 |
|---|---|
| @Configuration | Spring 설정 관련 Class로 @Component 등록되어 Scanning 될 수 있음 |
| @EnableAsync | Spring Method에서 비동기 기능을 사용가능하게 활성화함 |
| CorePoolSize | 기본 실행 대기하는 Thread 수 |
| MaxPoolSize | 동시 동작하는 최대 Thread 수 |
| QueueCapacity | MaxPoolSize 초과 요청에서 Thread 생성 요청시, 해당 요청을 Queue에 저장하는데 이때 최대 수용 가능한 Queue의 수. Queue에 저장되어있다가 Thread에 자리가 생기면 하나씩 빠져나가 동작 |
| ThreadNamePrefix | 생성되는 Thread 접두사 지정 |