본문 바로가기

Spring

Spring WebFlux 란 무엇일까

728x90
반응형

Spring WebFlux


Spring Web MVC는 Spring Framework에 속해있는 오리지널 프레임워크로 Servlet API와 Servlet Containers를 위해 만들어졌다.

Spring WebFlux는 Spring5에서 새롭게 추가된 모듈로 Reactive Stream, 백프레셔, 논블록킹 등을 지원하며 Netty, Undertow, 서블릿컨테이너에서 동작한다.

 

 

등장배경


적은 수의 쓰레드로 동시성을 처리하고, 적은 리소스로 확장할 수 있는 논블록킹 웹스택이 필요했다.

기존 Spring MVC에서 Servlet동작방식을 보면 Client에서 요청하면 서블릿 컨테이너가 받아서 서블릿으로 넘겨주게 된다.

서블릿컨테이너는 소켓도 관리하는데 서블릿에 요청을 전달할 때 Poller라는 개념을 이용해서 쓰레드에 커넥션을 넘겨준다.

폴러는 소켓 커넥션을 들고 있다가 소켓에 데이터를 처리할 수 있을 때 쓰레드를 할당하는 형태로 해서 쓰레드 유휴 시간을 줄여준다(NIO Connector 방식)

그러나 쓰레드를 할당후에 서블릿과 통신하는 구간은 여전히 Blocking이었다.

이 통신구간을 Nonblocking으로 처리하기 위해 Async Servlet이 나왔다.

Async Servlet은 Request를 바로 반환하지만 프로세싱하는 방식자체는 블로킹으로 동작한다.

(Request와 Response를 서빙하는 I/O)

이것을 커버하기 위해 Servlet3.1에서는 Nonblocking I/O가 추가되었다.

이로써 서블릿을 사용하는 애플리케이션 통신과정에 모두 Non blocking이 적용되었다.

그러나 서블릿에서 사용하는 HttpServletRequest, HttpServletResponse객체 내부에 InputStream와 OutputStream을 사용하고 있는데 Java stream은 블로킹 방식이다.

Spring5에서는 reactive기반의 webflux를 제공하게 되었고 Spring Webflux는 Servlet API를 기반으로 구축되지 않았기 때문에 Nonblocking이 가능하다.

 

 

Spring MVC vs Webflux


spring webflux vs mvc

  • 이미 잘 동작하는 Spring MVC애플리케이션이 있다면 변경할 필요가 없다. 명령형 프로그래밍은 코드를 작성하고 디버깅하는 쉬운 방법이다.
  • 논블로킹 웹스택을 찾고 있다면 Webflux를 선택할 수 있다.
  • Webflux는 JAVA8 람다 또는 Kotling과 가볍게 사용할 수 있다.
  • MSA에서 MVC또는 Webflux컨트롤러, 기능 엔드포인트를 함께 혼합해서 사용할 수 있다.
  • Webflux에서 원격서비스를 호출하는 경우 WebClient를 사용하여 Reactive type을 반환할 수 있다.

서버


Spring WebFlux는 Tomcat, Jetty, Servlet컨테이너 뿐만 아니라 Netty, Undertow와 같은 Servlet런타임에서도 지원된다.

Spring WebFlux에는 서버를 시작하거나 중지하기 위한 내장 지원이 없어서 Starter를 이용할 수 있는데 기본적으로 Netty를 사용한다.

728x90
반응형