Java 21에서 정식으로 도입된 Virtual Thread(가상 스레드)는 기존 Java의 스레드 모델을 근본적으로 개선한 경량 스레드 기능이다. 기존 OS 스레드는 생성 비용이 높고 메모리를 많이 사용하기 때문에 동시 요청이 많은 서버 환경에서 확장성에 한계가 있었다. Virtual Thread는 이 문제를 해결하기 위해 등장했으며 한 줄로 정의하면 “수십만 개의 동시 작업을 효율적으로 처리하기 위한 초경량 스레드”다.
기존 Thread의 문제점
Java의 기존 스레드는 Platform Thread(OS Thread) 기반이다. 이 방식의 가장 큰 문제는 생성 비용이 크고, 스레드마다 stack memory가 고정으로 할당되어 메모리를 많이 사용한다는 점이다. 또한 동시성 확장에 한계가 있어서 웹 서버에서 요청이 10,000개 들어올 경우 thread pool이 200개라면 나머지 요청은 대기하거나 실패하게 된다.
Virtual Thread의 핵심 아이디어
Virtual Thread는 OS 스레드 위에서 직접 실행되지 않고 Carrier Thread(OS Thread) 위에서 실행된다. 즉 Virtual Thread는 작업 단위이고 실제 실행은 소수의 OS Thread가 담당한다. Scheduler가 Virtual Thread를 적절하게 OS Thread에 배치하면서 실행하는 구조다. 핵심은 “스레드를 많이 만드는 것이 아니라 재사용하는 구조”라는 점이다.
Virtual Thread의 가장 중요한 특징
Virtual Thread는 매우 가볍기 때문에 수십만 개 생성이 가능하다. 또한 blocking 코드(JDBC, HTTP 호출, 파일 I/O)를 그대로 사용할 수 있으며, blocking이 발생해도 OS Thread가 함께 막히지 않는다. 기존 Java 코드 구조를 거의 변경하지 않고 사용할 수 있다는 점도 큰 장점이다. 기존 thread pool 기반 구조보다 단순하며 유지보수 부담이 줄어든다.
코드 예제 (Virtual Thread 사용)
기본 생성 방법은 다음과 같다.
Thread.startVirtualThread(() -> {
System.out.println("Virtual Thread 실행");
});
ExecutorService를 사용하는 방식도 있다.
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 1000; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread());
});
}
}
기존 thread pool 방식과 비교하면 Virtual Thread는 blocking 허용, 구조 단순화, 동시성 확장 측면에서 훨씬 유리하다.
Virtual Thread가 해결하는 문제
Virtual Thread는 동시성 확장 문제를 해결하여 수천에서 수백만 요청까지 처리할 수 있다. 또한 reactive programming 없이도 blocking 스타일 코드 그대로 확장 가능한 구조를 제공한다. 그 결과 서버 구조가 단순해지고 thread pool tuning 부담이 크게 줄어든다.
언제 사용하면 좋은가?
Virtual Thread는 웹 서버, REST API 서버, DB I/O가 많은 시스템, HTTP 호출이 많은 서비스에 적합하다. 반대로 CPU intensive 작업이나 GPU 연산 중심 작업에는 적합하지 않다.
Spring Boot에서 활용
Spring Boot 3.2 이상에서는 Virtual Thread를 쉽게 활성화할 수 있다.
spring:
threads:
virtual:
enabled: true
또는 Executor Bean으로 직접 설정할 수도 있다.
@Bean
public Executor taskExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
핵심 정리
Java 21 Virtual Thread는 기존 “무겁고 제한적인 스레드 모델”을 “가볍고 확장 가능한 작업 단위 모델”로 바꾼 기술이다. Thread를 많이 관리하는 방식에서 작업 중심 구조로 전환되며, blocking 코드 그대로 사용하면서도 높은 동시성을 처리할 수 있다.
한 줄 요약
Virtual Thread는 OS 스레드 하나로 수많은 작업을 효율적으로 처리하는 Java의 새로운 동시성 모델이다.
'Java' 카테고리의 다른 글
| Tomcat 성능 최적화 방법: NIO + Thread Pool 구조로 성능 극대화하기 (0) | 2026.04.20 |
|---|---|
| RAG란 무엇인가? (0) | 2026.04.20 |
| Spring AI 1.1.4 + pgvector 간단 예제 (0) | 2026.04.20 |
| TurboQuant란 무엇인가? (0) | 2026.04.20 |
| Spring AI 소개 및 핵심 정리 (0) | 2026.04.20 |