우당탕탕
[Spring] Spring Boot 가상 스레드(Virtual Threads) 적용하기 1편 본문
Spring Boot 가상 스레드(Virtual Threads) 적용하기 1편
안녕하세요! 이번에는 Java 21+의 가상 스레드(Virtual Threads)를 Spring Boot에 적용해 고성능 서버를 만들어 보겠습니다. 가상 스레드는 기존 플랫폼 보다 동시성을 활용하여 성능에 이점이 존재합니다.

목표
가상 스레드로 Spring Boot 성능 최적화.
- Spring Boot 3.2+ + Java 21 프로젝트 생성
- application.properties 한 줄 설정
- 동시 요청 벤치마킹으로 효과 확인
MSA나 실시간 서비스에 딱!
1. 프로젝트 생성
https://start.spring.io 접속 후 아래와 같이 설정:
Project: Gradle - Groovy
Language: Java
Spring Boot: 4.0.1
Group: com.example
Artifact: virtualthread
Java: 21
Dependencies: Spring Web 추가

IntelliJ에서 열고 Gradle 새로고침 (코끼리 클릭). 오류 시 Java 21 SDK 설정하세요.
2. 가상 스레드 활성화
src/main/resources/application.properties에 아래 한 줄 추가:
<< spring.threads.virtual.enabled=true >>

이 한 줄로 Tomcat/Netty가 자동으로 별도 코드 변경 없이 가상 스레드를 사용하게 됩니다.
3. 테스트 컨트롤러 생성
src/main/java/com/example/virtualthread에 TestController.java:
package com.example.virtualthread;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class TestController {
@GetMapping("/thread-test")
public String testThread() throws InterruptedException {
// 2초 지연 시뮬레이션 (블로킹 IO)
Thread.sleep(2000);
return "Virtual Thread ID: " + Thread.currentThread() +
" | Time: " + LocalDateTime.now();
}
}
서버 실행 (http://localhost:8080/thread-test)
4. 성능 테스트 (Apache Bench 추천)
Apache Bench 설치 -> https://mozzi-devlog.tistory.com/115
터미널에서 100 동시 요청:
ab -n 1000 -c 100 http://localhost:8080/thread-test/
기존 스레드: 스레드 풀 고갈로 무한 대기 상태 지속
가상 스레드: 모두 병렬로 즉시처리 가능
이로써 Spring Boot 가상 스레드 기본설정이 완료되었습니다. 한 줄의 추가로 동시 처리 성능이 획기적으로 향상된 걸 느끼실 수 있을 겁니다. 실제 프로젝트나 고트래픽 서비스에 바로 적용해 보시면 바로 와닿을 것 같습니다 ㅎㅎ. 다음 편에서는 @Async 통합과 JMeter 벤치마킹으로 좀 더 깊게 파보도록 하겠습니다.
'Tech > Spring' 카테고리의 다른 글
| [Spring] Spring Boot 가상 스레드(Virtual Threads) 적용하기 2편 -@Async + JMeter 고급 벤치마킹 (0) | 2025.12.31 |
|---|---|
| [Spring Boot] Spring Security + Redis로 DDoS 방어 구축하기 (0) | 2025.12.17 |
| [Spring Boot] 운영 환경을 위한 실용적인 로그 레벨 설정 (Practical Log Level) (0) | 2025.12.16 |
| [Spring] 빈 라이프사이클과 초기화 실수 feat. @PostConstruct, @Lazy, 순환참조 (3) | 2025.08.17 |
| [Spring] @Transactional 분리 시 발생하는 Self Invocation 오류와 그 원인 및 해결 (2) | 2025.08.16 |
