본문 바로가기
language/java

Virtual Thread (Java 21) 완벽 이해하기

by 죄니안죄니 2026. 6. 1.
반응형

Virtual Thread (Java 21) 완벽 이해하기

지금까지 우리는 Java 동시성의 발전 과정을 배웠다.

Thread
 ↓
Thread Pool
 ↓
ExecutorService
 ↓
CompletableFuture
 ↓
ForkJoinPool
 

그런데 이 모든 기술에는 공통 문제가 하나 있었다.

스레드가 비싸다.

그래서 Java 21에서 드디어 등장한 것이:

Virtual Threads

이다.


1. 왜 등장했을까?

기존 Thread는 사실상

OS Thread
 

이다.


예:

 
new Thread(...)
 

실행.


실제로는

Java Thread

↓

OS Thread

↓

CPU
 

연결.


2. 문제

OS Thread는 매우 비싸다.


생성 비용.

Stack 생성

OS 등록

Context Switch
 

발생.


3. 그래서 실무에서는

 
new Thread()
 

를 잘 안 쓰고

 
ThreadPoolExecutor
 

사용.


4. 문제는 여전히 존재

예:

동시 사용자 10만 명
 

Thread 10만 개 생성?

불가능.


메모리 터짐.


5. 그래서 지금까지는

Thread 수 제한
 

을 걸었다.


예:

 
newFixedThreadPool(200)
 

동시 요청 1만 개.

200개만 처리.

9800개 대기.


6. 이것이 현대 서버의 한계

특히.

DB 조회

REST API 호출

파일 읽기
 

같은 I/O 작업.


CPU는 놀고 있는데.


Thread는 대기 중.


비효율.


7. Virtual Thread 등장

한 줄 정의.

JVM이 관리하는 초경량 Thread
 

기존 Thread.

1 Java Thread

↓

1 OS Thread
 

Virtual Thread.

100만 Virtual Thread

↓

수십 개 OS Thread
 

8. 그림

기존.

Thread 1000개

↓

OS Thread 1000개
 

Virtual Thread.

Virtual Thread 100만 개

↓

OS Thread 20개
 

가능.


9. 핵심 개념

매우 중요.


Virtual Thread는

Carrier Thread
 

위에서 동작.


10. Carrier Thread란?

실제 OS Thread.


예:

Virtual Thread A

Virtual Thread B

Virtual Thread C

↓

Carrier Thread 1
 

11. 어떻게 가능한가?

스케줄링을

OS
 

가 아니라

JVM
 

이 함.


12. 예시

Virtual Thread.

 
Thread.ofVirtual()
      .start(task);
 

DB 호출.

DB 응답 대기
 

기존 Thread.

OS Thread도 같이 대기
 

13. Virtual Thread

DB 대기

↓

Virtual Thread 잠시 제거

↓

Carrier Thread 반납

↓

다른 작업 수행
 

14. 이것을

Unmount
 

라고 함.


15. 응답 도착

DB 결과 반환
 

Virtual Thread 다시 실행.


16. 결과

OS Thread 낭비 없음
 

17. 예제

Java 21.

 
try (var executor =
        Executors.newVirtualThreadPerTaskExecutor()) {

    executor.submit(() -> {

        Thread.sleep(1000);

        return "OK";
    });
}
 

18. 의미

Task 하나

↓

Virtual Thread 하나
 

생성.


19. 놀라운 점

예:

 
for(int i=0; i<100_000; i++)
 

 
executor.submit(...)
 

100,000개 생성 가능.


기존 Thread라면 거의 불가능.


20. ThreadPool이 필요 없나?

면접 단골.


많은 사람들이.

Virtual Thread

↓

ThreadPool 끝
 

이라고 생각.


절반만 맞음.


21. CPU 작업

예:

암호화

압축

영상 인코딩
 

Virtual Thread가 해결 못 함.


CPU는 여전히 제한적.


22. CPU Bound

여전히.

 
ThreadPoolExecutor
 

유효.


23. Virtual Thread가 강한 분야

I/O 작업.


대표.

DB 조회

REST API

파일 읽기

Socket 통신
 

24. 예시

 
userRepository.findById(...)
 

 
restTemplate.getForObject(...)
 

 
jdbcTemplate.query(...)
 

Virtual Thread와 궁합 좋음.


25. Spring Boot 지원

최근 버전.

Spring Boot


Spring Boot 3.2+

Virtual Thread 지원.


26. 설정

 
spring.threads.virtual.enabled=true
 

끝.


27. 그러면?

Tomcat 요청 처리도

Virtual Thread 기반.


28. CompletableFuture 필요 없어지나?

중요.


과거.

 
CompletableFuture
 

쓴 이유.

Thread 부족
 

문제 때문.


29. Virtual Thread 시대

예:

 
User user =
        userRepository.findById(id);

Order order =
        orderRepository.findById(id);
 

그냥 동기 코드 작성 가능.


Thread 부족 문제 거의 없음.


30. 그래서 요즘 추세

복잡한 비동기 체인

↓

단순한 동기 코드
 

로 회귀.


31. 하지만

CompletableFuture가 완전히 사라지는 것은 아님.


병렬 실행.

 
allOf()
 

여전히 유용.


32. Pinning 문제

Java 21 면접 단골.


Virtual Thread는

Carrier Thread 반납
 

해야 효율적.


33. 그런데

 
synchronized
 

사용.


특정 상황.

Carrier Thread 고정
 

될 수 있음.


34. 이것을

Pinning
 

이라고 함.


35. 예시

 
synchronized(lock) {

    Thread.sleep(10000);
}
 

Virtual Thread.

Carrier Thread 점유.

효율 감소.


36. 해결

 
ReentrantLock
 

권장.


최근 Java 진영에서 자주 언급.


37. 성능

공식 벤치마크 기준.


수만~수십만 동시 요청
 

처리 가능.


기존 ThreadPool 대비.

훨씬 적은 메모리
 

사용.


38. Virtual Thread vs Platform Thread

Java 공식 용어.


기존 Thread.

Platform Thread
 

새로운 Thread.

Virtual Thread
 

39. 비교

항목Platform ThreadVirtual Thread
생성 비용 매우 작음
메모리 작음
개수 수천 개 수준 수십만 개 가능
I/O 대기 비효율 매우 효율
CPU 작업 적합 적합
동시 접속 처리 제한적 강력

40. 실무에서 어떻게 생각해야 하나?

예전.

Thread 부족

↓

비동기

↓

CompletableFuture

↓

콜백 지옥
 

이제.

Virtual Thread

↓

동기 코드 작성

↓

대규모 동시 처리
 

가능.


41. 면접 단골 질문

Q. Virtual Thread란?

JVM이 관리하는 경량 Thread
 

Q. Platform Thread와 차이는?

OS Thread 직접 사용 안 함
 

Q. Virtual Thread는 언제 강한가?

I/O Bound 작업
 

Q. ThreadPool이 필요 없어지나?

I/O 작업은 많이 줄어듦

CPU 작업은 여전히 필요
 

Q. Pinning이란?

Carrier Thread가 고정되어
Virtual Thread 효율이 떨어지는 현상
 

Q. synchronized 대신 무엇을 권장하나?

ReentrantLock
 

42. 지금까지 동시성 전체 흐름

Thread

↓

Runnable

↓

synchronized

↓

volatile

↓

CAS

↓

Atomic

↓

ConcurrentHashMap

↓

ExecutorService

↓

ThreadPoolExecutor

↓

CompletableFuture

↓

ForkJoinPool

↓

Virtual Thread
 

43. 핵심 흐름 요약

Virtual Thread 생성
 ↓
Carrier Thread 배치
 ↓
I/O 대기
 ↓
Unmount
 ↓
Carrier Thread 반환
 ↓
다른 작업 수행
 ↓
응답 도착
 ↓
재실행
 

44. 가장 중요한 핵심 한 줄

Virtual Thread는 Java 21에서 도입된 경량 스레드로, JVM이 스케줄링을 담당하여 수십만 개의 동시 I/O 작업을 적은 수의 OS Thread로 효율적으로 처리할 수 있게 해주는 현대 Java 동시성의 핵심 기술이다.
 
반응형

댓글