본문 바로가기
Development/Spring Boot

자바, 스프링부트 가상스레드 도입과 관련한 짧은 개인 정리

by Nahwasa 2025. 5. 15.

 

특정 주제에 대해 짧게 생각 정리해둘 때 보통 notion을 사용했습니다.

최근 블로그에 그냥 부담없이 쓰고싶을때 쓰기로 마음을 바꿨으니, 평소 노션에 적는 형태를 블로그에 적어놔도 괜찮을 것 같아서 한번 적어봅니다.

 

이하 자바 및 스프링부트에서의 가상스레드 사용에 대해 검색해보며 개인적으로 이런식으로 도입하면 좋겠네 싶은 부분을 생각의 흐름대로 적어봤습니다. 가상스레드 자체에 대한 설명은 적지 않았습니다. 여러 글을 읽으며 제가 정리한 생각을 적어둔거라 사실과 다를 수 있습니다.

 

 

GPT 생성 이미지임

 

 

1. 애초에 트래픽이 별로 없으면 굳이 사용할 필요 없어보임

2. IO 연산이 많은 경우만 고려(네트워크 IO, 디스크 IO 등), pooling 방식으론 사용 지양

3. IO 연산이 많은 구간에 넣을 때, 논블로킹 IO로 처리하는 등 다른 방식이 더 성능이 좋을 순 있으나, 가상 스레드 적용은 기존 코드에 큰 수정 없이 사용할 수 있다는 장점이 있음. 즉, 적은 코드 수정으로 병렬성 확보 가능.

4. 사용하려면 최소 자바21 + 스프링부트3.2 필요. 가장 쉽게 사용할 방법은 spring.threads.virtual.enabled=true 옵션주기.

5. 단, 자바24 미만의 경우 synchronized 부분에서 가상스레드 언마운트가 안되고 플랫폼 스레드가 pinning됨 (즉, 플랫폼 스레드가 멈춤) -> 모든 라이브러리에 pinning 부분 확인할 순 없으니 사실상 전체 enabled 시키는건 의미가 없어보임

6. 즉, synchronized의 pinning이 해결된 자바24부터가 실질적인 자바 가상스레드 도입 기준 버전으로 보임. 물론 synchronized가 해결된거라, 다른 pinning 구간 있을 수 있음.

7. 테스트만으론 명확히 효율성 검증이 어려울 것 같음. 보수적으로 확실히 사용 필요한 부분 먼저 적용해보고, 실제 운영 통계 보고 점차적으로 구간 늘려나가는게 맞아보임. 무조건 트래픽 늘어난다고 좋은건 아니고, 오히려 GC 등으로 더 느려질 수 있음.

8. 스프링부트 사용 시 spring.threads.virtual.enabled 옵션은 false로 주고, 개별적으로 사용할 곳에 명시적으로 사용하는게 '7'의 관점에서 더 좋아보임.

9. no silver bullet

 

 

 

references

 

댓글