WebFlux 란
WebFlux 는 Spring 5에서 새롭게 추가된 모듈이다.
클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며
Non-blocking 에 reactive streams 의 BackPressure을 지원하며 Netty, Servlet3.1+ 컨테이너와 같은 서버에서 실행된다.
위의 그림은 각각의 기능들과 공통점에 대해 나와있다.
위는 전반적인 WebFlux의 구조이다.
WebFlux 를 사용하기 전에 WebFlux 가 왜 생겨났는지 궁금했다.
WebFlux 가 생긴 이유
적은 수의 스레드와 최소한의 하드웨어 자원으로 동시성을 처리하고 리소스를 확장하기 위해서 만들어졌다.
이는 새로운 공통 API 가 생긴 이유가 됐으며, tomcat 이 아닌 netty와 같은 잘 만들어진 비동기, 논블로킹 서버 떄문에 중요하고 한다.
함수형 프로그래밍 때문이다. java 5 에서 Rest controllers 나 unit test 가 만들어지고, java 8 에서는 함수형 API 를 위한 Lambda 표현식이 추가되었다. 이는 논블로킹 어플리케이션 API의 토대가 되었다.
서블릿 3.1 이 논블로킹을 일부분만 지원하기 때문에 만들어졌다.
WebFlux 사용 용도
WebFlux는 아래와 같은 용도로 사용한다
배민 기술블로그에서 가게노출 시스템을 사용할 때 WebFlux를 사용한다고 한다.
- 하나의 사용자 요청을 처리하기 위해 수십여개의 외부 시스템에 대한 요청이 필요한 시스템에서, 어떻게 가장 빠른 응답을 줄 수 있을까?
- 수많은 요청을 처리해야할 때 어떻게 쓰레드 지옥을 벗어날 수 있을까?
수십개의 동작이 동기로 이루어질 때 수행시간은 전체 요청 수행시간의 합이지만
비동기로 이루어지면 수행시간은 전체 요청 수행시간 중 최대가 된다.
동시 요청 수가 적을 때는 장점이 없을 수 있지만, 수십개의 요청이 동시에 필요한 시스템에서는 비동기로 인해 이득을 볼 수 있다.
아무리 비동기 동작이 가능하다고 해도 Blocking IO 기반의 동작을 하게 되면 스레드 지옥에서 벗어날 수 없다.
WebFlux는 이벤트 기반(Event Driven) 과 Asynchronous Non-blocking I/O 을 통해 리소스를 효율적으로 사용할 수 있게 하고, 이러한 동작으로 성능을 끌어올린다.
만약 blocking 코드가 있으면 WebFlux 를 사용하는 의미는 떨어지게 된다.
BackPressure
빠른 Publisher 와 느린 Subscriber 문제를 해결하는 원리이다.
Publisher 의 일방적인 데이터 Push가 아니라
Subscriber가 처리할 수 있을 만큼의 데이터만 Subscriber의 요청에 의해서 전달해주는 것이다.
공식문서
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
참고하면 좋을 사이트
'공부 > Spring' 카테고리의 다른 글
[webflux] PublishOn, SubscribeOn (0) | 2022.04.15 |
---|---|
[Java] Java 8 Streams - Reactor map() 과 flatMap() 차이 (2) | 2022.04.14 |
[Intellij] JUnit Test 실행 시 No tests found for given includes (0) | 2022.04.14 |
[spring] @Test 빌드시 ' Cannot find symbol method' 에러 (0) | 2022.04.13 |
[spring] Querydsl 사용이유 (0) | 2022.04.12 |