Spring Reactive stack에 대한 고찰

- 아래 내용은 https://docs.spring.io/spring-framework/reference/web/webflux/new-framework.html 의 내용을 정리한 것입니다. (번역한 것도 조금 있음)
## SpringWebFlux가 만들어진 이유
- 적은 수의 스레드로 동시성을 처리하고, 더 적은 하드웨어 리소스로 구동할 non-blocking 웹 스택이 필요하였다. 서블릿을 사용한 방법은 이것을 충족히켜주지 못했다.
- non-blocking 을 구현하기위해서는 언어적 지원도 필요한데 jdk 8 부터 functional 프로그래밍이 가능해졌다. (자바스크립트에서의 화살표 함수를 생각해보자)
## "Reactive" 란
- 보통 반응형이라고 하면 브라우저 사이즈가 변하거나, 마우스 클릭을 했을때 이벤트를 발생하는 것을 말하지만, I/O 이벤트에 반응하는 네트워크도 반응한다고도 할 수 있다. 
- 따라서, 네트워크에서의 "반응적"이란 요소는 non-blocking과 관련이 깊다. nodejs가 폭발적인 성장을 한 이유가 이것일 것이다. 
- non-blocking 이 잘 이해가 안된다면 "event-loop"를 공부하자
## Spring WebFlux가 선택한 라이브러리
- "Reactor"를 사용하고 있다. 
- project reactor : https://projectreactor.io/
- webflux를 공부하려면 reactor 공식 문서를 보자
## 서버
- Spring WebFlux는 Tomcat, Jetty, Netty, Undertow에서 사용할 수 있다.
- Tomcat, Jetty는 MVC와 WebFlux를 모두 사용할 수 있지만 사용법이 매우 다르다. 
- Undertow는 ServletAPI 없이 Undertow API를 직접 사용한다. 
## 성능
- 성과에는 많은 특징과 의미가 있습니다. [반응형 및 비차단 방식은 일반적으로 애플리케이션 실행 속도를 더 빠르게 만들지 않습니다]. 어떤 경우에는 가능합니다. 예를 들어 `WebClient`원격 호출을 병렬로 실행하기 위해 사용하는 경우입니다. 그러나 [비차단 방식으로 작업을 수행하려면 더 많은 작업이 필요하며 이로 인해 필요한 처리 시간이 약간 늘어날 수 있습니다.]
- [반응형 및 비차단형의 주요 예상 이점은 작고 고정된 수의 스레드와 더 적은 메모리로 확장할 수 있는 기능입니다. ]이는 애플리케이션이 더 예측 가능한 방식으로 확장되기 때문에 로드 시 애플리케이션의 탄력성을 높여줍니다. 그러나 이러한 이점을 관찰하려면 약간의 대기 시간(느리고 예측할 수 없는 네트워크 I/O 혼합 포함)이 필요합니다. 이것이 바로 반응성 스택이 강점을 보이기 시작하는 지점이며, 그 차이는 극적일 수 있습니다.
## WebFlux 정말 써야 할까
- 외부 api호출을 위한 webclient를 사용하는 것 이상으로하는 것은 의미가 없다.
- statck 자체가 다르므로 또다른 프레임워크를 익히는 것과 다를바 없다.
- jdk21 에 virtual thread가 지원되기 시작했다. 비교문서에서는 가상스레드가 성능이 더 좋다는 결과가 많다.
- reactive stack을 아는 개발자를 구할 수 없다.
- 공식문서에도 적혀있지만 reactive를 사용한다고 해서 속도가 더 빨라지지 않는다. 적은 리소스를 조금 더 활용할 수 있는 정도이다. 
- reactive는 nodejs를 시키자.

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

VSCode에서의 VIM 단축키와 키보드 구매 가이드

우분투에서 테스트링크(testlink)와 맨티스(mantis)로 테스팅 서버 구성하기