@Async

@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()을 재구현해야 하는 등 동일한 작업들의 반복이 잦았음

With @Async

@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 접두사 지정