💡 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를 사용하게 됩니다.
참고
docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-framework-choicewww.concretepage.com/questions/711
'👩💻TIL > Spring' 카테고리의 다른 글
[Spring Batch] 스프링배치 개념/핵심기능/파티셔닝 분할 방식 (0) | 2021.08.23 |
---|---|
[WebFlux] Mono와 Flux 개념과 구현 (0) | 2021.05.09 |
[Spring Security] 스프링시큐리티 시작하기 /기본세팅 (9) | 2020.05.15 |
[Spring Security] 스프링시큐리티의 기본 개념과 구조 (2) | 2020.05.12 |
댓글