Spring Framework Documentation

박우민·2020년 12월 14일
0

Spring Webflux

Web on Reative Stack

Spring webflux

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

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가 있다.

HttpHandler

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);

}

WebHandler API

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..

Special bean types

WebHttpHandlerBuilder을 꼭 확인해라.

The table below lists the components that WebHttpHandlerBuilder can auto-detect in a Spring ApplicationContext, or that can be registered directly with it

WebExceptionHandler

WebHandler나 WebFilter으로부터 발생한 Exception을 처리하기 위해 제공함

WebFilter

필터 체인과 webHandler의 rest 전 후에interceiption style 로직을 적용

WebSessionManager

webSession에 대한 관리자

ServerCodecConfigurer

form data와 multipart data에 대한 fHttpMessageReader 인스턴스를 위한 메소드를 제공

LocaleContextResolver

LocaleContext를 위한 resolver

ForwardedHeaderTransformer

forwarded type headers를 처리하기 위함

Filters

WebHandlerAPI 내에서 WebHandler와 필터체인의 rest 전/후에 interception-sytle logic을 적용하기 위해 사용할 수 있다.

CORS(cross Orgin Resource Sharing) contoller 내 annotation을 이용하여 CORS 설정이 가능하며,Spring security 과 함께 CORS Filter를 통해 사용할 수 있음

Exceptions

WebHandler나 WebFilter으로부터 발생한 Exception을 처리하기 위해 사용할 수 있음

ResponseStatusExceptionHandler
WebFluxResponseStatusExceptionHandler가 존재

Codecs

데이터 스트림을 인코딩 디코딩하기 위해 사용되는 모듈

DispatcherHandler

front controller pattern이 적용된 WebHandler의 구현체

반드시 이해 해야할 중요한 키워드

Reative

Reactive Stream

back presssure

궁금점

@RequestPart와 @RequestBody로 받는 것에 대한 차이 collecting?

WebSockets

  • RFC 6455의 전이중 표준화된 방법
  • It is a different TCP protocol form HTTP but is designed to work over HTTP
  • Even though WebSocket is designed to be HTTP-compatible and starts with an HTTP request
  • Http header 내 upgrade header를 이용하여 WebSocket 프로토콜로 업그레이드하는 과정이 존재함
  • in WebSockets, there is usually only one URL for the initial connect.

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.

profile
안녕하세요 Software Development Engineer 입니다.

0개의 댓글