백엔드/스프링 프레임워크 & 스프링 부트
스프링 프레임워크 `@Async`를 알아보자
slowcloud_
2025. 5. 6. 18:53
@Async를 사용하면 해당 메소드는 비동기로 실행이 된다. 반환값이 void거나, Future인 경우에만 비동기가 적용되며, 그 외의 경우에는 비동기로 실행되지 않고 무시된다. 스프링 프레임워크에서 제공하는 ListenableFuture와 Java 8 이후에서 제공하는 CompletableFuture도 비동기를 제공한다. 아래는 예시 코드이다.
@Service
public class VirtualService {
private final Logger logger = LoggerFactory.getLogger(VirtualService.class);
@Async
public CompletableFuture<Integer> DoSomething(int n) throws InterruptedException {
logger.info("we got %d!".formatted(n));
// do something
Thread.sleep(1000L);
return CompletableFuture.completedFuture(n);
}
}
스프링 프레임워크에서는 Executor를 빈으로 등록하면 이를 비동기 처리에 사용한다. 스프링 프레임워크에서는 Executor를 상속한 TaskExecutor를 주로 사용하며, 미리 만들어 둔 구현체들이 존재한다. 그 중 ConcurrentTaskExecutor, ThreadPoolTaskExecutor를 사용하면 가상 쓰레드를 사용할 수 있다. setVirtualThread를 실행하면 되며, true를 넣으면 가상 쓰레드를 사용한다.
@EnableAsync
public class AsyncConfiguration {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// init
executor.setCorePoolSize(10);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("virtual-");
// 가상쓰레드 사용 설정
executor.setVirtualThreads(true);
executor.initialize();
return executor;
}
}
스프링부트에서는 application.properties에서 spring.threads.virtual.enabled=true를 작성하면 된다.
spring.threads.virtual.enabled=true
@Async를 사용하면 Executor 등 쓰레드 활용 방식 등의 설정을 스프링 설정 단계에서 관리할 수 있다는 장점이 있다.
스프링 공식 가이드와 예시 리포지토리도 존재한다.