Webflux
springWebFlux란?
Spring5에서 reactive stack을 지원하는 web container freamework
Netty등 비동기 Non blocking 컨테이너 사용
springWebFlux특징
Non bolcking IO
- 최소한의 리소스로 효율적인 운영
- Singler worker thread가 Event loop 처리
Functional Endpoints
- Lambda 기반 functonal programming model
- Reqeuest Router가 handler로 request routing
- Handler method에 @RequestMapping선언부 없이 request/reponse를 App에서 전부 제어
spring MVC와 WebFlux
spring MVC와 WebFlux 선택
시스템을 새로 구축한다면
- 기능에 따라서, 내부 호출양에 따라서, 개발팀 구성에 따라서 선택할수 있다.
- WebFlux와 SpringMVC는 일정 수준까지는 동일한 성능을 보장한다. 하지만 일정 수준 이상의 요청량에 따라서는 위의 표와 같이 WebFlux의 성능이 압도적으로 우수하다.
- 하지만, WebFlux의 경우 Spring MVC모델보다 Learning curve가 높기 때문에, 위와 같이 호출량, 혹은 개발팀의 역량등에 따라 적응을 검토해볼수 있다.
WebFlux 프로젝트 구성
WebFlux의 경우 Filter, Handler, WebClient, WebfluxConfigurer로 구성되어 있다.
Filter
- 필터의 경우 Spring Security와 같이, 접근을 제어하고 특정 메소드를 제어하며, 사용자의 접근 방식을 제어하는 역할을 수행한다.
- webHandler API에 적용한다.
- 요청처리 전에 선행 로직 실행 가능하다.
- API Gateway역할을 하는 App에서 자주 사용한다.
아래는 Filter를 사용한 하나의 예입니다.
Handler
- httpHandler와 WebHandler로 구성되며, WebHandler에서는 DispatcherHandler가 각 컴포넌트를 호출하고, Functional Endpoint라는 특징을 가진다.
아래는 핸들러 메소드의 하나의 예이다.
Router
- Router는 말그대로 Routing Function이라는 특징을 가진다. 특정 Url에 Client측에서 요청이 오면 해다 역할을 수행하는곳에 연결시켜주는 역할을 한다.
- 여기서 Spring MVC의 @RequestMapping과의 차이점은 @RequestMapping은 단순히 data만 전달하는 것에 비해, Router Function은 Mono<HandlerFunction>을 전달하여 특정 Url에 대한 Handler Function을 전달해 해당 Function을 수행하도록 하는것에 있습니다.
RouterFUnctions.route()의 builder를 사용한 아래 예제를 사용하여 확인할수 있습니다.
WebClient
Non blocking Http Clinet Module로써, Blocking Http Client Module인 RestTemplate과 역할은 같지만, 블록킹의 여부라고 생각하면 됩니다.
R2DBC
- JDBC의 Blocking API를 대체하는 Nonblocking API Statck.
- 비교적 최신 버전인 Spring 5.3.2+ 버전 이후부터 사용 가능합니다.
Handling Errors
Error를 Handling하는 Handler에는 WebExeptionHandler, ResponseStatusExceptionHandler, WebFluxResponseStatusExceptonHandler가 존재합니다.
- WebExceptionHandler - webFilter / webHandler Chain에서 발생한 Exception 처리
- ResponseStatusExceptionHandler
- WebFluxResponseStatusExceptonHandler
'빗썸 테크코스 아카데미 > 1주차(Event Driven)' 카테고리의 다른 글
4일차 과제 실습 (0) | 2022.04.15 |
---|---|
3일차 리액티브 프로그래밍 오퍼레이션 (2) | 2022.04.13 |
2일 리액티브 프로그래밍 (0) | 2022.04.12 |
1일차 이벤트 드리븐 아키텍쳐 & 프로그래밍 (0) | 2022.04.11 |