Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

전공공부

[Webflux] Webflux, MVC, Virtual Thread...? 본문

Study/Spring Boot

[Webflux] Webflux, MVC, Virtual Thread...?

monitor 2024. 1. 27. 12:38

https://velog.io/@ddh963963/Webflux-R2dbc-nonblocking-vs-MVC-JDBC-blocking-%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8

 

Webflux + R2dbc (nonblocking) vs MVC + JDBC (blocking) 성능 테스트

완전한 환경에서 한 테스트가 아니기 때문에 편차가 있을 수 있습니다. WebFlux vs MVC 테스트의 목적 및 개요 WebFlux 와 MVC의 성능테스트를 눈으로 보고 스레드의 동작을 살피는 것이 테스트의 목적

velog.io

https://medium.com/oracledevs/spring-blocking-vs-non-blocking-r2dbc-vs-jdbc-and-webflux-vs-web-mvc-900d72ee19c1

 

Spring: Blocking vs non-blocking: R2DBC vs JDBC and WebFlux vs Web MVC

Spring WebFlux and R2DBC perform better at higher concurrency than Spring Web MVC and JDBC

medium.com

https://stackoverflow.com/questions/68873995/r2dbc-vs-spring-jdbc-vs-spring-data-jdbc

 

R2DBC vs Spring Jdbc Vs Spring Data JDBC?

On Using Spring JDBC which works very well and has some improvements over JPA when using Batch processing. I would love to learn why to use Spring Data JDBC when you already have Spring JDBC. I would

stackoverflow.com

https://techblog.woowahan.com/15398/

 

Java의 미래, Virtual Thread | 우아한형제들 기술블로그

JDK21에 공식 feature로 추가된 Virtual Thread에 대해 알아보고, Thread, Reactive Programming, Kotlin coroutines와 비교해봅니다.

techblog.woowahan.com

 

도움이 되었던 링크를 먼저 소개합다.

 

내가 해당 건에 대해서 궁금증을 가지게 된 계기가 개인 프로젝트를 진행함에 있어서 만일 대용량의 트래픽이 몰릴 경우를 대비하여야 겠다는 생각을 하게 되었고 이때, 채택 가능한 안으로는 일반적인 MVC + JDBC or JPA 구조 또는 Webflux + R2DBC를 사용하여야 겠다는 생각을 하게 되었습니다.

 

우선 두 링크를 보면 알겠지만 Webflux를 활용해서 non-blocking 모델을 채택하는게 엄청난 효과를 보인다는 의견에는 반대를 할 수가 없을 것 같습니다.

 

하지만, Webflux를 통한 사내 프로젝트를 진행하다보면 정확한 디버깅 위치를 찾기 힘들고 TDD를 위해서 단위테스트를 작성하기 힘들다는 단점이 존재하였다. 이러한 이유만으로 Kotlin + Spring으로 러닝 커브를 가지고 이관하기는 쉽지 않다고 생각했고 위 단점을 모두 상쇄 시킬 수 있는 좋은 아이디어를 찾다가 Virtual Thread라는 기술에 관심을 가지게 되었습니다. ( Virtual Thread는 JDK 21 LTS 정식 Feature로 포함되어서 사용이 가능합니다. )

 

Virtual Thread는 무엇인가.

 

우선 자바에서 Thread가 어떻게 사용되는지 파악을 해야겠죠.

 

기존에는 Native Thread로 JNI를 활용해서 OS 커널로 부터 부여 받은 Thread를 직접 사용했다고 합니다. 그리고 각 Thread 들은 I/O , Blocking 상황들에 의해서 점유되게 되는데 이때, Context Switching을 진행하여 다른 Thread가 비동기 적으로 일을 하게 하는 방식을 채택해서 사용했다고 합니다.

 

하지만, 사용자 트래픽이 늘어남에 따라서 컨텍스트 스위칭 비용이 부담이 되고 메모리 크기별로 1thread, 1MB라고 해도 2GB면 2000Thread 만 사용 가능한데 전국구에서 들어오는 트래픽이 커지면 어떻게 될까요? 특히, 일일 10억 건의 트래픽을 담당하는 국내 서버라면 엄청나게 큰 스케일의 서버가 필요 할 겁니다. 

 

이를 Virtual Thread로 최대한 활용하여 Webflux의 단점을 상쇄시키고 사용 할 수 있을 듯 합니다.

 

상세 테스트 내역과 내용을 모두 가져오기에는 사실상 무리가 있고 해당 링크의 4번째 배민 기술블로그를 참조해주세요.

 

그래서 개발시 중요하게 생각 할 점을 보자면, CPU Bound 작업을 제외한 나머지에서는 모두 성능상 우위를 차지하고 있습니다. 만일, AI 분석과 같은 CPU 자원 자체를 많이 쓰는 서버라면 사실 컨텍스트 스위칭이 자주 발생하지 않으니 기존의 Thread 방식으로 사용하는 것이 오히려 좋을 것이고, 그것이 아니라면 Virtual Thread 방식을 채용하는게 좋을 것으로 보입니다.

 

결론
- Virtual Thread 방식을 차용하는 것은 기존 Webflux의 러닝 커브를 줄이고 성능상의 혜택을 볼 수 있다.
- JPA, JDBC를 사용하면 결국 Pinning Issue가 생긴다. 결국 다 내려가서 기다리게 된다. 이를 주의하여서 R2DBC로 개발을 해야 비동기 이점을 볼 수 있다.
- CPU를 직접 한 서비스가 많이 쓰는 프로젝트에서는 비효율

 

정리

 

사실 Webflux도 공부 할 겸 Virtual Thread도 체험 해 볼겸해서 개인 프로젝트를 진행하려고 합니다. 이미 사내 프로젝트 일부는 Webflux로 구현을 했기 때문에 깊이 있는 이해가 필요해서 해볼 것 같고 Virtual Thread의 경우에는 아직 구현을 실제로 해본적이 없어서 직접 부딪혀 보고 싶다는 생각이 들어서 진행 할 예정입니다.

 

추후 만나게 되는 이슈도 정리해서 공유 해보겠습니다. 모두들 좋은 하루 되세요.