Reactive Stream API 기반의 reactive-stack web application이다.
reactive stream api는 servelt 3.1+ container, undertow, netty와 같은 비동기 서버의 실행하기 위해 사용된다.
기존 웹 프레임워크인 Spring Web MVC는 서블릿 API와 서블릿 컨테이너를 위해 제작되었다.
reactive web stack인 spring web flux는 spring 5.0 이후부터 지원되고 있으며, 전체적으로 비동기이며, reactive stream back pressure를 지원한다.
두 프레임워크는 스프링 프레임워크 내에 공존 할 수 있음을 참고하자.
만들어진 이유는 적은 수의 스레드로 동시성을 처리하고 적은 하드웨어 리소스로 확장하기 위한 non-blocking web stack의 수요라고 한다.
또한 java 5, 8에서 annotation, 람다 등이 추가되면서 fuctional API이 가능해짐에 따라 비동기 로직의 선언적 구성을 허용하는 연속 스타일 API와 non-blocking application이 가능해졌다고함
webflux에서는 reactive Stream 표준에 대한 reactive library로 reactor(mono, flux)를 제공한다.
Reactive Core에 대한 라이브러리는 org.springframework에 spring-web library이다.
Http Request를 처리하기 위해 HttpHandler와 WebHandler API를 제공한다.
HttpHandler는 Netty, Undertow, Tomcat, Jetty, Servlet3.1 Contaniner에 대한 어댑터들과 함께 non-blocking I/O와 Reactive back pressure을 사용한 Http request 처리에 대한기본 규약이다.
WebHandler API는 좀더 상위 레벨로 annotated controller과 functional endpoints와 같은 구체적인 프로그래밍 모델이 빌트된 API이다.
Client Side에서는 non-blocking I/O와 Reactive Streams back pressure 관련 Http Request을 수행하기 위한 ClientHttpConnector가 있다.
public interface HttpHandler {
/**
* Handle the given request and write to the response.
* @param request current request
* @param response current response
* @return indicates completion of request handling
*/
Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response);
}
HttpHandler를 기반으로 MUltipleExceptionHandler, Multiple WebFilter, Single Webhandler 컴포넌트의 체인을 통해 요청을 처리하기 위한 Web API이다.
While HttpHandler has a simple goal to abstract the use of different HTTP servers, the WebHandler API aims to provide a broader set of features commonly used in web applications such as:
User session with attributes.
Request attributes.
Resolved Locale or Principal for the request.
Access to parsed and cached form data.
Abstractions for multipart data.
and more..
WebHttpHandlerBuilder을 꼭 확인해라.
The table below lists the components that WebHttpHandlerBuilder can auto-detect in a Spring ApplicationContext, or that can be registered directly with it
WebHandler나 WebFilter으로부터 발생한 Exception을 처리하기 위해 제공함
필터 체인과 webHandler의 rest 전 후에interceiption style 로직을 적용
webSession에 대한 관리자
form data와 multipart data에 대한 fHttpMessageReader 인스턴스를 위한 메소드를 제공
LocaleContext를 위한 resolver
forwarded type headers를 처리하기 위함
WebHandlerAPI 내에서 WebHandler와 필터체인의 rest 전/후에 interception-sytle logic을 적용하기 위해 사용할 수 있다.
CORS(cross Orgin Resource Sharing) contoller 내 annotation을 이용하여 CORS 설정이 가능하며,Spring security 과 함께 CORS Filter를 통해 사용할 수 있음
WebHandler나 WebFilter으로부터 발생한 Exception을 처리하기 위해 사용할 수 있음
ResponseStatusExceptionHandler
WebFluxResponseStatusExceptionHandler가 존재
데이터 스트림을 인코딩 디코딩하기 위해 사용되는 모듈
front controller pattern이 적용된 WebHandler의 구현체
Reative
Reactive Stream
back presssure
@RequestPart와 @RequestBody로 받는 것에 대한 차이 collecting?
WebSocket is also a low-level transport protocol, which, unlike HTTP, does not prescribe any semantics to the content of messages. That means that there is no way to route or process a message unless the client and the server agree on message semantics.
WebSocket clients and servers can negotiate the use of a higher-level, messaging protocol (for example, STOMP), through the Sec-WebSocket-Protocol header on the HTTP handshake request. In the absence of that, they need to come up with their own conventions.