[Reference] WebFlux
WebFlux
Spring WebFlux는 Spring5에서 새롭게 추가된 모듈이다.
WebFlux는 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며, reactive-stack web framework이며 non-blocking에 reactive stream을 지원한다.
- 장점 : 고성능, spring과 완벽한 통합, netty 지원, 비동기 non-blocking 메세지 처리
- 단점 : 오류 처리가 다소 복잡하다.
Spring MVC / WebFlux
Spring MVC와 WebFlux의 공통점은 둘 다 Tomcat, Jetty, Undertow와 같은 서버에서 실행할 수 있다.
Spring MVC
하나의 요청에 대해 하나의 스레드가 사용되기 때문에, 대량의 요청을 대비해 미리 스레드 풀을 생성해 놓으며, 각 요청마다 스레드를 할당하여 처리한다.
- 1 request : 1 thread
- sync + blocking
Spring WebFlux
Reactive Programming은 Non Blocking과 고정된 스레드 수 만으로 모든 요청을 처리함으로 Spring MVC의 문제들을 해결한다.
서버는 스레드 한 개로 운영하며, Default로 CPU 코어 개수의 스레드를 가진 워커 풀을 생성하여 해당 워커 풀 내의 스레드로 모든 요청을 처리한다.
제약이 있다면, Non Blocking으로 동작해야만 하며, Blocking 라이브러리가 필수적으로 사용되어야 한다면, 워커 스레드가 아닌 외부 별도의 스레드로 요청을 처리해야 한다.
이는 요청을 처리하는 Event Loop가 절대 blocking되지 않아야 하기 때문이다.
- many request : 1 thread
- async + non-blocking
사용하는 경우
-
이미 작동중인 Spring MVC 애플리케이션이 있다면 Spring WebFlux로 변환 할 필요가 없으며, Spring MVC는 명령형 프로그래밍(객체지향, 절차지향)을 사용한다.
-
non-blocking 웹 스택을 생성한다고 하면, 선택 가능한 서버(Netty, Tomcat, Jetty, Undertow 및 Servlet 3.1 + 컨테이너)를 제공하는 Spring WebFlux를 선택할 수 있다.
-
Spring WebFlux는 Java8 람다 또는 Kotlin과 함께 사용하는 가볍고 기능적인 웹 프레임워크에 유용하다.
-
MSA에서 Spring MVC와 Spring WebFlux 컨트롤러의 혼합 애플리케이션을 가질 수 있다.(서비스간 호출이 많은 MSA에 WebFlux가 적합하다.)
-
애플리케이션이 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에 접근할 수 있게 되었다.
댓글남기기