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. 비교
| 생성 비용 | 큼 | 매우 작음 |
| 메모리 | 큼 | 작음 |
| 개수 | 수천 개 수준 | 수십만 개 가능 |
| 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 동시성의 핵심 기술이다.
'language > java' 카테고리의 다른 글
| Factory Method Pattern (팩토리 메서드 패턴) (0) | 2026.06.01 |
|---|---|
| Static Factory Method (정적 팩토리 메서드) (0) | 2026.06.01 |
| 병렬 Stream(parallelStream) 주의점 완벽 이해하기 (0) | 2026.06.01 |
| ConcurrentHashMap 동시성 처리 완벽 이해하기 (0) | 2026.06.01 |
| DeadLock(교착상태) 원인과 해결 완벽 이해하기 (0) | 2026.06.01 |
댓글