반응형
스프링 부트에서 @Async 애너테이션을 사용하면 비동기적으로 작업을 수행할 수 있으며, 이때 스레드풀에 담긴 스레드의 개수만큼 동시에 작업을 수행할 수 있습니다.
스프링 부트의 비동기 처리
- 비동기 작업: @Async 애너테이션을 메서드에 적용하면, 해당 메서드는 비동기적으로 실행됩니다. 즉, 메서드 호출 시 즉시 반환되고, 실제 작업은 별도의 스레드에서 실행됩니다.
- 스레드풀: 비동기 작업은 기본적으로 스레드풀에서 관리되는 스레드를 사용하여 실행됩니다. 스레드풀의 크기는 설정에 따라 다르며, 동시에 실행할 수 있는 최대 작업 수를 결정합니다.
동작 방식
- 스레드풀 설정: 스프링 부트에서 비동기 작업을 위해 사용할 스레드풀을 설정할 수 있습니다. 예를 들어, @EnableAsync 애너테이션을 사용하고 Executor 빈을 정의하여 스레드풀의 크기와 큐 용량 등을 설정합니다.
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 최소 스레드 수
executor.setMaxPoolSize(10); // 최대 스레드 수
executor.setQueueCapacity(25); // 큐 용량
executor.initialize();
return executor;
}
}
- 비동기 메서드 호출: 비동기 메서드를 호출하면, 호출한 스레드는 즉시 반환되고, 비동기 작업은 스레드풀에 있는 스레드에서 실행됩니다.
- 동시 작업 처리: 스레드풀의 크기(예: 5)만큼의 스레드가 동시에 작업을 수행할 수 있습니다. 만약 동시에 요청된 비동기 작업 수가 스레드풀의 크기를 초과하면, 추가 작업은 큐에 저장됩니다.
예시 시나리오
- 스레드풀 크기: 5
- 동시 요청 수: 8
- 비동기 메서드가 호출될 때, 첫 5개의 요청은 각각 스레드풀의 스레드에 할당되어 동시에 실행됩니다.
- 나머지 3개의 요청은 큐에 저장되어 대기합니다.
- 스레드 중 하나가 작업을 완료하면, 큐에서 대기 중인 작업 중 하나를 가져와 실행합니다.
요약
스프링 부트의 @Async를 통해 비동기 작업을 수행하면, 스레드풀의 크기만큼의 스레드가 동시에 작업을 처리할 수 있습니다. 이를 통해 많은 사용자가 동시에 접근하는 경우에도 효율적으로 작업을 수행할 수 있습니다.