본문 바로가기
👩‍💻TIL/Spring

[Spring] WebFlux의 개념 / Spring MVC와 간단비교

by devuna 2021. 5. 7.
728x90

💡 WebFlux란?

Spring WebFlux는 Spring 5에서 새롭게 추가된 모듈입니다.

WebFlux는 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며, 

reactive-stack web framework이며 non-blocking에 reactive stream을 지원합니다.

 

 

장점 : 고성능, spring 과 완벽한 통합, netty 지원, 비동기 non-blocking 메세지 처리

단점 : 오류처리가 다소 복잡하다. 

 

 

스프링5는 Spring Boot 2 부터 도입이 되었으며, Spring Boot 2 의 stack 는 아래와 같습니다.

 Reactive Stack 를 사용할지, Servlet Stack 를 사용할지 선택이 필요합니다.

 

 

💡Spring MVC vs. WebFlux

 

 

 Spring MVC와 WebFlux의 공통점은 @Controller, Reactive 클라이언트입니다. 둘 다 Tomcat, Jetty, Undertow와 같은 서버에서 실행할 수 있습니다. Spring MVC에서는 명령형 논리, JDBC, JPA를 가질 수 있습니다. Spring WebFlux에서는 기능적 엔드 포인트, 이벤트 루프, 동시성 모델을 가질 수 있습니다. Spring WebFlux는 Netty 서버에서 실행할 수 있다는 장점이 있습니다.

 

<Spring MVC 또는 WebFlux를 사용하는 경우>

 

1. 이미 작동중인 Spring MVC 애플리케이션이 있다면 Spring WebFlux로 변환 할 필요가 없으며,  Spring MVC는 작성하고 디버그하는 쉬운 방법 인 명령형 프로그래밍을 사용합니다.

 

2. non-blocking 웹 스택을 생성하고자한다면, 선택 가능한 서버 (Netty, Tomcat, Jetty, Undertow 및 Servlet 3.1+ 컨테이너)를 제공하는 Spring WebFlux를 선택할 수 있습니다. 웹 엔드 포인트) 및 반응 라이브러리 (Reactor, RxJava 또는 기타)를 선택할 수 있습니다.

 

3. Spring WebFlux는 Java 8 lambda 또는 Kotlin과 함께 사용하는 가볍고 기능적인 웹 프레임 워크에 유용합니다.

 

4. 마이크로 서비스 애플리케이션에서 우리는 Spring MVC와 Spring WebFlux 컨트롤러의 혼합 애플리케이션을 가질 수 있습니다. Spring WebFlux 엔드 포인트도 가질 수 있습니다.

 

5. 애플리케이션이 JPA, JDBC 또는 네트워킹 API에 의존하는 경우 Spring MVC가 최선의 선택이다.

 

(Webflux 는 Asynchronous Non-blocking I/O 을 방식을 활용하여 성능을 끌어 올릴 수 있는 장점이 있다. 그런데 이 말은 즉, Non Blocking 기반으로 코드를 작성해야 한다. 만약 Blocking 코드가 있다면 Webflux를 사용하는 의미가 떨어지게 된다. 얼마 전까지는 Java 진영에 Non Blocking 을 지원하는 DB Driver가 없었지만, 최근에 R2DBC 가 릴리즈되어 이제는 Java 에서도 Non Blocking 으로 DB 를 접근할 수 있게 되었다.)

 

💡 Mono와 Flux

 

Spring Webflux에서 사용하는 reactive library가 Reactor이고 Reactor가 Reactive Streams의 구현체입니다.

Flux와 Mono는 Reactor 객체이며, 차이점은 발행하는 데이터 갯수입니다.

 

  • Flux : 0 ~ N 개의 데이터 전달
  • Mono : 0 ~ 1 개의 데이터 전달

보통 여러 스트림을 하나의 결과를 모아줄 때 Mono를, 각각의 Mono를 합쳐서 하나의 여러 개의 값을 여러개의 값을 처리할 떄 Flux를 사용합니다.

그런데 Flux도 0~1개의 데이터 전달이 가능한데, 굳이 한개까지만 데이터를 처리할 수 있는 Mono라는 타입이 필요할까요? 데이터 설계를 할때 결과가 없거나 하나의 결과값만 받는 것이 명백한 경우,  List나 배열을 사용하지 않는 것처럼, Multi Result가 아닌 하나의 결과셋만 받게 될 경우에는 불필요하게 Flux를 사용하지 않고 Mono를 사용하게 됩니다. 

 

👉🏻 Mono와 Flux 개념과 구현 더 알아보기

 

 

 

 

 

 

참고

docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-framework-choicewww.concretepage.com/questions/711

728x90

댓글