-
[Spring Webflux] #0 Webflux 기본 개념개발 2023. 2. 22. 03:02
스프링에서, 웹 스택은 Web Servlet, Web Reactive 이렇게 두가지가 있다.
Spring MVC 와 Spring WebFlux
Spring MVC vs. Spring WebFlux Web Servlet에 해당되는 Spring MVC는 Java EE의 Servlet API를 기반으로 한다.
Spring MVC는 Blocking 방식이다.
요청들이 들어오면 큐에 넣고 미리 만들어 둔 스레드 풀에서 스레드를 가져와서 사용한다. (하나의 요청에 하나의 스레드를 사용한다.)
그래서 스레드 풀 사이즈를 초과하는 많은 요청들이 들어오면 나머지 요청들을 처리하지 못하고 이전 작업들이 처리 될 때까지 큐에서 대기하게 되므로 지연시간이 늘어나게 된다. (Thread Pool Hell 현상)
이와 같은 대용량 트래픽 문제를 해결하기 위해 Spring 5버전부터 Spring Webflux가 도입되었다.
Web Reactive의 Spring Webflux는 Reactive Stream 사양의 Reactor 라이브러리를 기반으로 한다.
Spring Webflux는 Non-Blocking 방식이다.
Spring Webflux 공식문서에서는 Reactive라는 용어를 변화에 반응하도록 설계된 프로그래밍 모델이라 정의한다.
I/O 이벤트에 네트워크 요소들이 반응하는 것, 마우스 이벤트에 UI가 반응하는 것과 같이 예시를 들 수 있다.
그런 의미에서 Non-Blocking은 작업 완료 또는 데이터를 사용 가능하다는 알림에 반응하기 때문에 reactive라고 할 수 있다.
Spring Webflux는 하나의 스레드가 여러 요청을 처리한다는 점에서 Spring MVC와 다르다.
Event Loop Model
반응형 프로그래밍(Reactive Programming)이 적은 수의 스레드로 동시성을 달성하기 위해 사용하는 반응형 프로그래밍 모델 중 하나인 이벤트 루프 모델을 살펴 보면,
Event Loop Model 1. 이벤트 루프는 단일 스레드에서 실행된다. (기본적으로 CPU 코어 수 만큼 worker thread를 가진다.)
2. 이벤트 루프는 이벤트 큐에서 이벤트(요청)들을 순차적으로 처리하며 callback을 platform에 등록하고 즉시 반환한다.
3. Platform은 작업(DB 호출이나 외부 API 호출 같은) 완료를 트리거 할 수 있다.
4. 이벤트 루프는 작업이 완료되면 callback을 트리거하여 결과를 원래 호출자에게 보낸다.
쉽게 말해, 각각의 요청의 상태에 반응하여 한 스레드에서 한 작업을 대기하는 동안 다른 작업을 할 수 있다. (비동기)
Spring Webflux는 이렇게 Event Loop를 통해서 여러 요청들을 비동기적으로 처리할 수 있다.
Webflux가 무조건적으로 좋은가?
그렇다고 Spring Webflux가 장점만 가지고 있는 것은 아니다.
애초에 스프링 공식문서에도 잘 동작하는 Spring MVC기반의 어플리케이션이 이미 있다면 Webflux로 바꿀 필요가 없다고 한다.
그리고 의존성도 제한적이다. 영속성 API인 JPA나, 외부 API 호출과 같이 Blocking이 필요한 작업은 결국 동기적으로 동작하기 때문에 모든 부분이 Non-Blocking하게 구현되어야만 제 성능을 낼 수 있다.
참고
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux
'개발' 카테고리의 다른 글
Docker로 Elasticsearch + Kibana 개발환경 구성하기 (2) 2023.11.24 [Spring Webflux] #1 Reactive Streams 이해하기 (0) 2023.02.25 라즈베리파이 우분투 서버 구축 #2 Docker Engine 설치 (2) 2022.12.06 라즈베리파이 우분투 서버 구축 #1 우분투 설치 & SSH 설정 (0) 2022.12.05 라즈베리파이 우분투 서버 구축 #0 (0) 2022.12.05