JDK 21 기반 서버 스레드 모델 최적화 (Virtual Thread)
Java 21부터 Virtual Thread(가상 스레드)가 정식 기능으로 제공되면서, 서버 애플리케이션의 동시성 모델이 크게 발전했다.
Spring Boot 3.x 역시 Virtual Thread 지원을 강화하며, 많은 서비스가 기존의 Platform Thread 기반 구조에서 더 효율적인 스레드 모델로 이동하고 있다.
이 글에서는 Virtual Thread의 동작 방식과 Spring Boot에서의 최적화 전략을 정리한다.
#기존 Platform Thread 방식의 한계
기존 Java 서버는 OS 스레드를 직접 사용하는 Platform Thread 기반이었다.
이 구조는 다음과 같은 문제를 가지고 있다:
- 스레드 생성 비용이 비싸다
- 동시 요청 수가 증가하면 스레드 풀을 매우 크게 유지해야 한다
- IO 작업(HTTP 요청, DB 조회)에 의해 블로킹이 자주 발생한다
- 대규모 트래픽 환경에서 확장성이 떨어진다
특히 DB 조회, 외부 API 호출 등 IO 중심 서비스는 스레드 블로킹 문제 때문에 성능 병목을 쉽게 겪는다.
#Virtual Thread란?
Virtual Thread는 OS 스레드와 독립적으로 동작하는 lightweight 스레드다.
수십만 개의 스레드를 매우 저렴한 비용으로 생성할 수 있으며, Java의 기존 동기 API를 그대로 사용하면서도 비동기 수준의 처리량을 얻을 수 있다.
장점
- 스레드 생성 비용이 거의 0에 가깝다
- 수십만 개의 동시 요청을 처리할 수 있다
- 기존 동기 방식 코드를 그대로 사용 가능
- Thread-per-request 모델을 자연스럽게 지원
- 코드 복잡도 증가 없이 비동기 성능을 얻는다
Thread-per-request 모델 부활
과거에는 요청마다 스레드를 생성하는 구조가 비효율적이었지만,
Virtual Thread 도입으로 이 모델이 다시 최적 구조로 떠올랐다.
#Spring Boot에서 Virtual Thread 활성화
Spring Boot 3.2 이상에서는 Virtual Thread를 공식 지원한다.
Tomcat, Jetty, Undertow 등 기존 서버에서도 Virtual Thread 기반 실행이 가능하다.
간단한 설정으로 Virtual Thread 활성화
@Bean
public TaskExecutor applicationTaskExecutor() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
Spring WebMVC 요청 처리부도 Virtual Thread로 실행되도록 설정 가능하다.
Tomcat + Virtual Thread
spring:
threads:
virtual:
enabled: true
#Virtual Thread의 성능 특징
Virtual Thread는 특히 다음 상황에서 큰 성능 향상을 보여준다:
- 대량의 IO 요청을 처리하는 API
- 비즈니스 로직보다 외부 API 응답 대기 비중이 큰 서비스
- 대량의 동시 연결이 필요한 채팅/알림/웹훅 API
실제 성능 실험 사례
외부 API 호출(대기 시간 200ms)을 1000개 요청할 때:
- Platform Thread: 스레드 풀 제한 때문에 처리량 낮음
- Virtual Thread: 대기 시간이 스레드를 잡아먹지 않음 → 처리량 크게 증가
#Virtual Thread 적용 시 주의점
Virtual Thread가 만능은 아니며, 다음 포인트를 주의해야 한다.
CPU 바운드 작업에는 효과 없음
- 순수 계산 작업은 Virtual Thread의 장점을 거의 활용하지 못한다
- CPU 작업은 Platform Thread나 Executor 기반 병렬화가 더 적합
블로킹이 심한 JDBC 드라이버는 영향 있음
- 대부분의 MySQL JDBC는 Virtual Thread 친화적이지만
- 특수 DB 드라이버는 적합하지 않을 수 있음
스레드 로컬(ThreadLocal) 남용 금지
Virtual Thread는 ThreadLocal을 물리 스레드에 저장하지 않기 때문에
ThreadLocal 의존 로직이 있다면 정확히 동작하지 않을 수 있다.
#Virtual Thread가 최적인 서비스 유형
- 외부 API 호출이 많은 API Gateway
- 대량 조회 위주 서비스 (랭킹, 피드, 외부 연동)
- 장시간 대기 상태가 포함된 서비스
- 멀티플렉싱 없이 동기 코드 유지하고 싶은 팀
즉, 동시성은 필요하지만 코드 복잡도 증가 없이 해결하고 싶은 경우 Virtual Thread가 가장 강력하다.
마치며
JDK 21의 Virtual Thread는 서버 동시성 모델에 큰 변화를 가져왔다.
동기 코드의 단순함과 비동기 수준의 성능을 동시에 얻을 수 있으며, Spring Boot 3.x의 공식 지원으로 도입 장벽도 크게 낮아졌다.
다음 글에서는 고트래픽 환경에서의 서버 메모리·CPU 최적화 전략을 다룬다.
GC 튜닝, 메모리 누수 방지, 대규모 트래픽 안정화 기법을 이어서 설명할 예정이다.
'TIL' 카테고리의 다른 글
| Spring Boot 성능 최적화 7 (0) | 2025.11.03 |
|---|---|
| Spring Boot 성능 최적화 6 (0) | 2025.10.31 |
| Spring Boot 성능 최적화 4 (0) | 2025.10.29 |
| Spring Boot 성능 최적화 3 (0) | 2025.10.28 |
| Spring Boot 성능 최적화 2 (0) | 2025.10.27 |