bedaily.me
Java2026년 4월 20일3분 읽기

Spring Boot 3.x에서 Virtual Threads 활용하기

Java 21 Virtual Threads를 Spring Boot 3.2+에 적용하는 방법과 플랫폼 스레드 대비 성능 비교를 정리합니다.

Spring BootVirtual ThreadsJava 21성능

개요

Java 21에서 정식 출시된 Virtual Threads는, OS가 직접 스케줄링하는 플랫폼 스레드와 달리 JVM이 소수의 캐리어(플랫폼) 스레드 위에 다중화해 스케줄링하는 경량 스레드입니다. 블로킹이 발생하면 가상 스레드는 캐리어에서 내려오고(unmount), 캐리어는 다른 가상 스레드를 실행합니다. Spring Boot 3.2부터 공식 지원이 추가됐습니다.

기존 방식의 한계

Spring MVC의 기본 스레드 모델은 요청당 하나의 OS 스레드를 사용합니다.

📄TraditionalController.java
@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // I/O 블로킹 — 이 스레드는 응답까지 점유됨
        return userService.findById(id);
    }
}

I/O가 많은 워크로드에서는 스레드가 블로킹 상태로 대기하며 리소스를 낭비합니다.

플랫폼 스레드 · 요청당 1 스레드Virtual Threads · 캐리어에 다중화요청 수천 건요청대기 큐Tomcat 풀 (200 고정)BLOCKED — I/O 대기BLOCKED — I/O 대기BLOCKED — I/O 대기200개 모두 점유되면→ 이후 요청은 큐잉가상 스레드 수천 개블로킹 시 unmount ↓캐리어 풀 (≈ CPU 코어)carrier — VT 실행 중carrier — 다음 VT 실행소수 캐리어로 수천 VT 처리
플랫폼 스레드는 요청당 1개를 점유해 풀이 고갈되지만, 가상 스레드는 블로킹 시 캐리어에서 내려와 소수의 캐리어를 재사용한다

Virtual Threads 활성화

Spring Boot 3.2+ 환경에서는 설정 한 줄로 활성화할 수 있습니다.

📄application.yml
spring:
  threads:
    virtual:
      enabled: true

또는 Java Config로:

📄VirtualThreadConfig.java
@Configuration
public class VirtualThreadConfig {

    @Bean
    public TomcatProtocolHandlerCustomizer<?> virtualThreadCustomizer() {
        return handler ->
            handler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
    }
}

성능 비교

설정동시 요청 1,000p95 응답시간
플랫폼 스레드 (200개)큐잉 발생850ms
Virtual Threads정상 처리120ms

위 수치는 I/O 블로킹이 많은 워크로드를 가정한 예시이며, 실제 값은 워크로드·하드웨어·다운스트림 자원에 따라 달라집니다.

주의사항

Virtual Threads는 CPU-bound 작업이 아닌 I/O-bound 작업에 효과적입니다. synchronized 블록 안에서 블로킹하거나 네이티브 메서드(JNI/FFI)를 호출하면 캐리어 스레드를 핀닝(pinning)해 오히려 성능이 저하될 수 있습니다. 다만 JDK 24(JEP 491)부터 synchronized 블로킹으로 인한 핀닝은 해소됐습니다 — JDK 21~23에서는 ReentrantLock 사용을 권장합니다. 또한 다운스트림 자원(예: DB 커넥션 풀)이 병목이면 가상 스레드를 아무리 늘려도 처리량은 그 한계에 묶입니다.

마무리

기존 Spring MVC 코드를 변경하지 않고 설정만으로 처리량을 크게 개선할 수 있는 것이 Virtual Threads의 강점입니다. Spring Boot 3.2+ 프로젝트에서 I/O 집약적인 서비스라면 적극 도입을 권장합니다.

주간 기술 뉴스레터

Backend · AI · Java 핵심 내용을 매주 이메일로 보내드립니다.