@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
등 쓰레드 활용 방식 등의 설정을 스프링 설정 단계에서 관리할 수 있다는 장점이 있다.
스프링 공식 가이드와 예시 리포지토리도 존재한다.
참고
'백엔드 > 스프링 프레임워크 & 스프링 부트' 카테고리의 다른 글
gradlew 명령어 알아보기 (0) | 2025.08.03 |
---|---|
JSpecify와 스프링 프레임워크 7에서의 적용 (3) | 2025.07.12 |
IoC Container와 생명주기를 알아보자 (0) | 2025.06.11 |
스프링 프레임워크 `@Cacheable`을 알아보자 (0) | 2025.05.13 |