본문 바로가기
백엔드/스프링 프레임워크 & 스프링 부트

스프링 프레임워크 `@Async`를 알아보자

by slowcloud_ 2025. 5. 6.

@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 등 쓰레드 활용 방식 등의 설정을 스프링 설정 단계에서 관리할 수 있다는 장점이 있다.

스프링 공식 가이드와 예시 리포지토리도 존재한다.

참고