webflux
-
Spring Webflux Cachespring 2019. 10. 28. 01:02
개요 스프링 웹플럭스와 Reactor를 사용하여 웹서버를 개발할 때 고민이 되는 부분이 있다. 바로 캐시이다. 기존 mvc 모델에서는 스프링 캐시를 사용하여 캐싱을 쉽게 할 수 있었지만, 웹플럭스 모델에서는 스프링 캐시를 이용하여 캐싱을 할 수 없다. 다음과 같이 @Cacheable 어노테이션을 이용하여 캐싱을 한다고 하면, mvc 모델 @Cacheable public List list() { // Integer List를 리턴 } 웹플럭스 모델 @Cacheable public Mono listMono() { // Mono 체인을 리턴 } mvc 모델에서는 캐시하고자 하는 값 자체를 캐싱할 수 있지만, 웹플럭스 모델에서는 위처럼 Mono 객체가 캐싱된다. 리액티브 스트림의 생명주기 글에서 다루었듯이, M..
-
Spring WebFlux - Configspring 2019. 8. 29. 12:56
개요 Spring Webflux Java Configuration은 어노테이션 기반의 컨트롤러 방식이나 functional endpoints 방식에서 요청을 처리하기 위한 bean들을 정의하고 웹 관련 설정을 커스터마이징할 수 있는 api를 제공한다. @EnableWebflux 라는 어노테이션으로 웹플럭스 설정을 활성화할 수 있다. @Configuration @EnableWebFlux public class WebConfig { } WebFlux config API를 오버라이딩하기 위해서는 아래와 같이 WebFluxConfigurer을 구현한다. @Configuration @EnableWebFlux public class WebConfig implements WebFluxConfigurer { // Im..
-
Spring Webflux - CORSspring 2019. 7. 31. 19:10
개요 Spring Webflux도 MVC와 동일하게 CORS(Cross-Origin Resource Sharing)를 지원한다. 보안 상의 이유로, 브라우저는 다른 도메인으로의 AJAX 호출을 금지한다. CORS는 도메인 간의 요청을 인증하는 것에 대한 W3C 규약으로, 대부분의 브라우저들이 이를 구현하고 있다. 여기서는 CORS 규약에 대한 자세한 설명은 하지 않고, webflux에서 관련 설정하는 법을 다루고자 한다. CORS에 대한 자세한 설명은 아래 참고 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS 설정 Local Configuration 어노테이션 컨트롤러 메소드에 @CrossOrigin 어노테이션을 사용하면 도메인 간 요청을 가능하게 할 수..
-
Spring Webflux - Functional Endpointsspring 2019. 7. 25. 12:52
개요 Spring WebFlux는 WebFlux.fn이라는 요청을 라우팅하고 처리하는 경량의 함수형 프로그래밍 모델을 포함하고 있다. 물론 Webflux는 기존 MVC처럼 어노테이션 기반의 프로그래밍 모델도 지원하기 때문에, 두 가지 모델 중 하나를 개인 선호에 따라 선택하여 쓸 수 있다. WebFlux.fn에는 다음과 같은 두 가지 핵심 클래스가 있다. - HandlerFunction : ServerRequest를 인자로 받아 Mono를 리턴한다. 어노테이션 기반 모델에서 @RequestMapping 메소드의 바디와 동일한 역할이다. - RouterFunction : ServerRequest를 인자로 받아 Mono를 리턴한다. router function이 매치가 되면, 그에 맞는 handler fuc..
-
Spring Webflux - DispatcherHandlerspring 2019. 7. 18. 12:50
개요 스프링 webflux의 request 처리는 DispatcherHandler를 거쳐 적절한 handler에 요청 처리를 맡기는 형태이다. 스프링 MVC에서 DispatcherServlet의 역할을 DispatcherHandler가 한다고 생각하면 된다. WebHttpHandlerBuilder가 HttpHandler들을 체이닝하는데, DispatcherHandler도 함께 체이닝된다. 전반적인 request 처리 과정은 아래와 같다. 웹서버(netty, jetty 등)에서 handle → ServerManager.handle() → 체인된 HttpHandler들 → DispatcherHandler.handle() 의 과정으로 HttpHandler에서 리퀘스트가 처리된다. DispatcherHandle..
-
Spring WebClientspring 2019. 7. 10. 17:11
개요 Spring Webflux에는 reactive, non-blocking하게 HTTP 요청을 처리할 수 있도록 WebClient라는 모듈을 제공한다. 기존의 RestTemplate과 같은 역할 하지만, non-blocking하다라는 점에서 차이가 있다. 내부적으로 WebClient는 HTTP 클라이언트 라이브러리에 위임하는데, 디폴트로 Reactor Netty의 HttpClient를 사용한다. Reactor Netty 외에도, Jetty의 HttpClient를 지원하며, 다른 라이브러리도 ClientHttpConnector에 넣어주면 사용할 수 있다. 설정 WebClient를 생성하는 가장 간단한 방식은 아래와 같은 static 팩토리 메소드들을 사용하는 것이다. WebClient.create() W..
-
Spring Webflux + Reactorspring 2019. 5. 13. 14:17
Spring 5 개요 스프링5는 내부적으로 스프링 부트2를 사용하며, web stack은 2가지로 구성되어 있다. 기존처럼 서블릿 구조를 사용하는 Spring MVC stack과 스프링5부터 새롭게 도입된 Reactive stack인 Spring Webflux 스택으로 이루어져 있다. 위 그림에서 볼 수 있듯이, Reactive stack인 경우에는 Reactor가 필수이고, Netty와 같은 비동기/non-blocking 모델의 네트워킹 프레임워크를 사용한다. 물론 Reactive stack에서도 Tomcat, Jetty와 같은 서블릿 기반의 컨테이너를 사용할 수 있지만, 이 경우에는 Servlet 3.1 non-blocking I/O를 사용한다. webflux도 비동기/non-blocking 모델이기..