Spring
-
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 모델이기..
-
Spring AMQPspring 2019. 5. 13. 14:13
개요 Spring AMQP는 AMQP 기반의 메세징 솔루션이다. 메세지를 주고 받는 것과 관련한 추상화된 template을 제공한다. 이를 이해하기 위해서, Message Queue, AMQP를 우선 살펴본다. Message Queue MOM(Message Oriented Middleware) 응용 스프트웨어 간의 메세지 교환을 비동기적으로 처리하기 위한 소프트웨어이다. Message Queue는 MOM을 구현하기 위해 주로 사용되는 방법이다. 이름에서 유추할 수 있듯이 메시징에 큐를 사용한다. sender와 receiver가 직접적으로 메시지를 교환하지 않고, 중간에 큐를 두어 비동기적으로 교환한다. publisher/subscriber model) 따라서, application과 분리가 가능하고, 메..
-
JDK Dynamic Proxy vs CGLib Proxyspring 2019. 5. 13. 11:57
개요 Spring AOP는 2가지 타입의 proxy를 제공한다. 바로 JDK Dynamic Proxy와 CGLib Proxy이다. Spring AOP의 ProxyFactoryBean이 proxy를 생성하는데, 경우에 따라 이 둘 중 하나를 선택해서 사용하는 방식이다. 각 Proxy가 어떻게 다르고 어떤 경우에 쓰이는지 살펴보자. JDK Dynamic Proxy JDK Dynamic Proxy는 interface 기반의 proxy이다. 이는 큰 단점인데, 왜냐하면 모든 target class가 interface를 구현하고 있어야하기 때문이다. 또한, JDK Dynamic Proxy는 Java reflecton을 사용해 method를 invoke한다. 이를 이해하기 위해 먼저 Java reflection을 ..