JAVA SPRING

Spring WebFlux란?

앙헬디마리아 2021. 5. 29. 18:29
728x90

지난번에 spring 버전별 차이에 대해 알아보다가 WebFlux에 대해 궁금한것이 생겨 한번 정리를 해보기로 했다.

 

WebFlux란?

Spring Framwork5에서 새롭게 추가된 모듈이다. web-flux는 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이라고 한다.

 

여기서 reactive에 대한 선행학습이 필요하다. 간단하게 알아보자 

 

Reactive Programming 

 

리액티브 프로그래밍을 한마디로 정의하자면 다음과 같다.

https://m.blog.naver.com/jdub7138/220983291803

 즉, 비동기적 데이터 흐름을 처리하는 프로그래밍이다.

 

다시 본론으로 돌아가서 이런한 Reactive 스타일의 개발을 도와주는 모듈이 WebFlux이다.

 

 

그럼 왜 WebFlux가 탄생하게 되었나?

 

1. 적은 양의 스레드와 최소한의 하드웨어 자원으로 동시성을 핸들링하기 위해 만들어졌다.

서블릿 3.1이 논블로킹을 지원하지만, 일부분이다. 이는 새로운 공통 API가 생긴 이유가 됐으며, Netty와 같은 잘 만들어진 async, non-blocking 서버를 사용한다.

 

Netty는 프로토콜 서버 및 클라이언트와 같은 네트워크 어플리케이션을 빠르고 쉽게 개발하는 것을 가능하게 해주는 NIO 클라이언트 서버 프레임워크이다.

 

2.  함수형 프로그래밍 때문이다.

Java8에서는 함수형 API를 위한 Lambda 표현식이 추가됐다. 이는 non-blocking 어플리케이션 API의 토대가 됐다. 

 

여기 까지 글을 읽었다면 무엇인가 공통점을 찾았을 것이다.

간단히 설명하자면 WebFlux는 비동기적인 일을 처리하기에 적합한 프로그래밍 모듈인 것이다.

 

 

그러면 어떠한 상황에 사용해야하는가? 

 

WebFlux는 아래와 같은 용도로 사용하는 것을 추천 한다고 한다. (by 토비)

  • 비동기 - 논블록킹 리액티브 개발에 사용
  • 효율적으로 동작하는 고성능 웹어플리케이션 개발
  • 서비스간 호출이 많은 마이크로서비스 아키텍처에 적합

출처: https://kimyhcj.tistory.com/343 [기억과 기록]

 

Spring WebFlux

Spring5에 도입된 WebFlux Spring MVC 는 Java EE의 Servlet Spec에 기반하여 만들어 졌고 본질적으로 Blocking + 동기방식입니다. Spring Framework 3.x부터 비동기 방식을 지원하고 있지만 S..

kimyhcj.tistory.com

 

마이크로서비스 아키텍쳐 ( MSA )

MSA란 ? MicroService Architecture의 줄임말로써 , 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크. 마이크로 서비스 아키텍처의 장단점 ● 장점 마이크로 서비스는

yous3163.tistory.com

 

간단히 말해 서비스 단위별로 어플리케이션을 개발하는 용도로 많이 사용되는 구조이다.

 

만약 서비스의 단위가 많다면..? 많은 요청을 여러개로 분산? 하여 처리해야 한다. 이 때 비동기적으로 요청을 처리하고 한 곳에서 많은 요청을 처리하는 것 보다 시간이 단축이 될 수가 있다.

 

하지만 꼭 장점만 있는 것이 아니다.

 

단점으로는 동시에 많은 요청이 들어오면 스레드를 생성하고, 이를 처리하기 위해 Context Switching이 발생하고 이는 많은 비용이 들기 때문에 각 상황에 맞게 사용해야 한다.

 

WebFlux에 대해 조금 더 자세히...

 

spring-web 모듈은 reactive 기반으로써 Spring WebFlux를 포함한다.

 

Spring WebFlux는 두 종류의 프로그래밍 모델을 선택할 수 있다.

  • Annotated Controllers : Spring MVC와 일치하며 spring-web 모듈과 동일한 어노테이션을 기반으로한다. Spring MVC 및 WebFlux 컨트롤러는 모두 반응형(Reactor and RxJava) 반환 타입을 지원하기때문에 크게 다르지 않다. 차이점이라고 하면 WebFlux가 반응형 아규먼트인 @RequestBody를 지원한다는 것이다.
  • Functional Endpoints : Lambda 기반의 경량 함수형 프로그래밍 모델이다. 어플리케이션이 요청을 라우팅하고 처리하는데 사용할 수 있는 작은 라이브러리 혹은 유틸리티 집합으로 생각할 수 있다. annotated Controller와의 큰 차이점은 어플리케이션이 처음부터 끝까지 요청 처리를 담당한다는 것과 어노테이션을 통해 의도를 선언하고 콜백을 수행한단 것이다.

 

 

Spring MVC와 Spring WebFlux는 모두 어노테이션으로 구성된 컨트롤러를 지원하지만 동시성 모델과 blocking와 thread에 대한 기본 가정에는 몇 가지 주된 차이점이 있다.

 

Spring MVC (및 일반적으로 서블릿 어플리케이션)에서는 어플리케이션이 현재 스레드를 차단할 수 있다고 가정한다. (e.g. remote call) 따라서 서블릿 컨테이너는 요청 처리 도중 잠재적인 blocking을 흡수할 수 있도록 큰 스레드 풀을 사용한다.

 

Spring WebFlux (및 일반적으로 non-blocking 서버)에서는 어플리케이션이 차단되지 않는다고 가정한다. 따라서 non-blocking 서버는 작은 크기의 고정된 스레드 풀(이벤트 루프 워커)을 사용해 요청을 처리한다.

 

 

두 방식의 동작 흐름을 보면 조금 다른 것을 느낄 수 있다.

 

먼저 Spring WebFlux의 구조부터 알아보자

 

Spring MVC의 경우 서블릿 컨테이너와 서블릿을 기반으로 웹 추상화 계층을 제공 했는데 WebFlux는 서블릿컨테이너 + 네트워크 어플리케이션 프레임워크(Netty, Undertow)를 함께 지원해 Reactive Stream 기반으로 웹 추상화계층을 제공한다.

 

Spring WebFlux의 구조

  • HttpHandler : non-blocking I/O 와 Reactive Stream을 통한 HTTP Request 처리를 위한 기본 규약으로 Reactor Netty, Undertow, Tomcat, Jetty, and any Servlet 3.1+ container가 포함되어 있음
  • WebHandler API : request process를 위한 좀더 높은수준의 범용 웹 API

 

기존의 MVC 패턴과 WebFlux의 차이점

 

1. MVC에서 가지고 있던 FrontController구조에서의 DispatcherServlet가 WebHandler가 대신 수행

2. Result를 위한 Handler가 따로있어서 ResponseEntityResultHandler, ServerResponseResultHandler, ResponseBodyResultHandler, ViewResolutionResultHandler Handler의 타입에따라 return을 보냄

 

 

 

참조


https://heeyeah.github.io/spring/2020-02-29-web-flux/

 

[Spring] WebFlux란?

WebFlux? Spring Framwork5에서 새롭게 추가된 모듈이다. web-flux는 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이라고 한다. 스프링 공식문서에 있는, Spring WebFlux에 대한 소개와

heeyeah.github.io

https://taes-k.github.io/2019/05/21/about-spring-reactive/#spring-mvc%EC%99%80-spring-webflux

 

Spring5 리액티브 (Web flux)

1.5 Spring5 Reactive 이번챕터에서 다룰 Spring Reactive는 제가 실무에서는 다루어보지 못한 기술입니다. 하지만 Spring5가 나오면서 가장 열정적으로 소개하고있는 기술이기에 정리를 해보려고 합니다. S

taes-k.github.io

 

728x90