본문 바로가기

빗썸 테크코스 아카데미/1주차(Event Driven)

5일차 WebFlux

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