Web Reactive Framework
This section provides basic information on the Spring Web Reactive support in Spring Framework 5
이 섹션에서는 Spring Framework 5의 Spring Web Reactive 지원에 대한 기본 정보를 제공합니다.
Introduction - 소개
1.1 Reactive Programming - 반응형 프로그래밍
In plain terms reactive programming is about non-blocking applications that are asynchronous and event-driven and require a small number of threads to scale. A key aspect of that definition is the concept of backpressure which is a mechanism to ensure producers don’t overwhelm consumers. For example in a pipeline of reactive components that extends from the database to the HTTP socket when the HTTP client is slow the data repository slows down or stops until capacity frees up.
일반적으로 반응형 프로그래밍은 비동기적이고 이벤트 중심이며 확장에 적은 수의 스레드가 필요한 비블로킹 응용 프로그램에 관한 것입니다. 이 정의의 핵심은 생산자가 소비자를 압도하지 않도록 하는 메커니즘인 배압의 개념입니다. 예를 들어, HTTP 클라이언트가 느릴 때 데이터베이스에서 HTTP 소켓으로 확장되는 반응 구성 요소의 파이프 라인에서 데이터 저장소가 느려지거나 용량이 확보 될 때까지 중지됩니다.
From a programming model perspective reactive programming involves a major shift from imperative style logic to a declarative composition of async logic. It is comparable to using CompletableFuture
in Java 8 and composing follow-up actions via lambda expressions.
프로그래밍 모델 관점에서 리액티브 프로그래밍은 명령형 로직에서 비동기 로직의 선언적 구성으로 크게 전환됩니다. Java 8에서 CompletableFuture
를 사용하고 람다식을 통해 후속 조치를 구성하는 것과 비교할 수 있습니다.
For a more extended introduction to reactive programming check the excellent multi-part series “Notes on Reactive Programming” by Dave Syer.
리액티브 프로그래밍에 대한 확장된 소개는 Dave Syer의 우수한 멀티파트 시리즈 "리액티브 프로그래밍에 대한 참고 사항"을 확인하십시오.
1.2 Spring Web Reactive Types - 유형
Spring Framework 5 embraces Reactive Streams as the contract for communicating backpressure across async components and libraries. Reactive Streams is a specification created through industry collaboration that has also been adopted in Java 9 as java.util.concurrent.Flow
.
Spring Framework 5는 Ractive Streams를 비동기 구성 요소와 라이브러리에 걸쳐 backpressure을 전달하는 계약으로 채택합니다. 반응형 스트림(Reactive Streams)은 Java 9에서도 java.util.concurrent.Flow
로 채택된 업계 협업을 통해 만들어진 사양입니다.
The Spring Framework uses Reactor internally for its own reactive support. Reactor is a Reactive Streams implementation that further extends the basic Reactive Streams Publisher
contract with the Flux
and Mono
composable API types to provide declarative operations on data sequences of 0..N
and 0..1
.
Spring Framework는 자체 반응 지원을 위해 Reactor를 내부적으로 사용합니다. Reactor는 Reactive Streams 구현으로, Flux
및 Mono
구성 가능한 API 유형으로 기본 Reactive Streams Publisher
계약을 추가로 확장하여 0..N
그리고 0..1
의 데이터 순서에 대한 선언적 작동을 제공하는 반응형 스트림 구현입니다
The Spring Framework exposes Flux
and Mono
in many of its own reactive APIs. At the application level however, as always, Spring provides choice and fully supports the use of RxJava. For more on reactive types check the post “Understanding Reactive Types” by Sebastien Deleuze.
Spring Framework는 Flux
와 Mono
를 자체 대응 API에 공개합니다. 그러나 항상 그렇듯이 애플리케이션 수준에서 Spring은 RxJava의 사용을 완전히 지원하고 선택권을 제공합니다. 반응형 유형에 대한 자세한 내용은 세바스티안 델루제의 “반응형 유형 이해” 게시물을 확인합니다.
2 Spring Web Reactive Overview - 개요
개요
2.1 Spring Web Reactive Module - 모듈
Spring Framework 5 adds a new spring-web-reactive
module that supports the same @Controller
programming model as Spring MVC but executed on a reactive, non-blocking engine. The diagram below shows how Spring MVC and Spring Web Reactive compare side by side:
Spring Framework 5는 스프링 MVC와 동일한 @Controller
프로그래밍 모델을 지원하지만 반응성이 뛰어난 비차단 엔진에서 실행되는 새로운 spring-web-reactive
모듈을 추가합니다. 아래 다이어그램은 스프링 MVC와 스프링 웹 반응성이 나란히 비교되는 방식을 보여 줍니다.
Spring Web Reactive makes use of Servlet 3.1 non-blocking I/O and runs on Servlet 3.1 containers. It also runs on non-Servlet runtimes such as Netty and Undertow. Each runtime is adapted to a set of shared, reactive ServerHttpRequest
and ServerHttpResponse
abstractions that expose the request and response body as Flux<DataBuffer>
with full backpressure support on the read and the write side.
Spring Web Reactive는 Servlet 3.1 비차단 I/O를 사용하며 Servlet 3.1 컨테이너에서 실행됩니다. 또한 Netty 및 Untow와 같은 비서비스 실행 시간에도 실행됩니다. 각 런타임은 요청과 응답 본문을 Flux<DataBuffer>
로 노출하고 읽기 및 쓰기 측에서 최대 역압 지원을 받는 공유된 ServerHtpRequest
및 ServerHtpResponse
추상화 세트로 조정됩니다.
The spring-core
module provides reactive Encoder
and Decoder
contracts that enable the serialization of a Flux
of bytes to and from typed objects. The spring-web
module adds JSON (Jackson) and XML (JAXB) implementations for use in web applications as well as others for SSE streaming and zero-copy file transfer.
spring-core
모듈은 입력 된 객체와 바이트의 Flux
직렬화를 가능하게하는 반응성 Encoder
및 Decoder
계약을 제공 합니다. spring-web 모듈은 웹 애플리케이션뿐만 아니라 SSE 스트리밍 및 제로 카피 파일 전송에 사용하기 위해 JSON (Jackson) 및 XML (JAXB) 구현을 추가합니다.
The spring-web-reactive
module contains the Spring Web Reactive framework that supports the @Controller
programming model. It re-defines many of the Spring MVC contracts such as HandlerMapping
and HandlerAdapter
to be asynchronous and non-blocking and to operate on the reactive HTTP request and response. For this reason Spring MVC and Spring Web Reactive cannot share any code. However they do share many of the same algorithms.
Spring-web-reactive
모듈에는 @Controller
프로그래밍 모델을 지원하는 Spring Web Reactive 프레임워크가 포함되어 있습니다. HandlerMapping 및 HandlerAdapter와 같은 많은 스프링 MVC 계약을 비동기식 및 비차단 방식으로 재지정하고 HTTP 요청 및 응답에 따라 작동합니다. 이러한 이유로 Spring MVC와 Spring Web Reactive는 어떤 코드도 공유할 수 없습니다. 그러나 동일한 알고리즘을 많이 공유합니다.
The end result is a programming model identical to today’s Spring MVC but with support for reactive types and executed in a reactive manner. For example a controller method can declare the following as an @RequestBody
method argument:
최종 결과는 오늘날의 Spring MVC와 동일하지만 반응형 유형을 지원하며 반응형 방식으로 실행된 프로그래밍 모델입니다. 예를 들어 컨트롤러 메서드는 다음을 @RequestBody
메서드 인수로 선언할 수 있습니다.
Account account
— the account is deserialized without blocking before the controller is invoked.Mono<Account> account
— the controller can use theMono
to declare logic to be executed after the account is deserialized.Single<Account> account
— same as withMono
but using RxJavaFlux<Account> accounts
— input streaming scenario.Observable<Account> accounts
— input streaming with RxJava.
Account account
— 컨트롤러가 호출되기 전에 계정이 차단되지 않고 역직렬화됩니다.Mono<Account> account
— 컨트롤러가Mono
를 사용하여 계정 역직렬화 후 실행할 로직을 선언할 수 있습니다.Single<Account> account
—Mono
와 동일하지만 RxJava를 사용합니다.Flux<Account> accounts
— 입력 스트리밍 시나리오입니다.Observable<Account> accounts
— RxJava를 사용하여 스트리밍을 입력합니다.
The above also applies to return value handling:
위의 내용은 반환 값 처리에도 적용됩니다.
Mono<Account>
— serialize without blocking the given Account when theMono
completes.Singe<Account>
— same but using RxJava.Flux<Account>
— streaming scenario, possibly SSE depending on the requested content type.Flux<SseEvent>
— SSE streaming.Observable<SseEvent>
— same but using RxJava.Mono<Void>
— request handling completes when theMono
completes.void
— request handling completes when the method returns; implies a synchronous, non-blocking controller method.Account
— serialize without blocking the given Account; implies a synchronous, non-blocking controller method.
Mono<Account>
—Mono
가 완료되면 지정된 계정을 차단하지 않고 직렬화합니다.Singe<Account>
—Mono
와 동일하지만 RxJava를 사용합니다.Flux<Account>
— 스트리밍 시나리오, 요청된 콘텐츠 유형에 따라 SSE가 발생할 수 있습니다.Flux<SseEvent>
— SSE 스트리밍입니다.Observable<SseEvent>
— SSE 스트리밍은 같지만 RxJava를 사용합니다.Mono<Void>
—Mono
가 완료되면 요청 처리가 완료됩니다.void
— 메서드가 반환되면 요청 처리가 완료됩니다. 이는 동기식 비메모리 컨트롤러 메서드를 의미합니다.Account
— 지정된 계정을 차단하지 않고 직렬화합니다. 즉, 동기식 비차단 컨트롤러 방법을 의미합니다.
2.2 Reactive Web Client
Spring Framework 5 adds a new reactive WebClient
in addition to the existing RestTemplate
.
Spring Framework 5는 기존 RestTemplate
와 더불어 반응성이 뛰어난 새로운 WebClient
를 추가합니다.
Each supported HTTP client (e.g. Reactor Netty) is adapted to a set of shared, reactive ClientHttpRequest
and ClientHttpResponse
abstractions that expose the request and response body as Flux<DataBuffer>
with full backpressure support on the read and the write side. The Encoder
and Decoder
abstractions from spring-core
are also used on the client side for the serialization of a Flux
of bytes to and from typed objects.
지원되는 각 HTTP 클라이언트(예: Rotor Netty)는 요청과 응답 본체를 Flux<DataBuffer>
로 노출하는 공유된 반응형 ClientHtpRequest
및 ClientHtpResponse
추상화에 적응하고 읽기 및 쓰기 측에 완전한 backpressure 지원을 제공합니다. 스프링 코어의 인코더와 디코더 추상화는 클라이언트 측에서도 바이트의 플룩스를 타이핑된 객체로 연재하는 데 사용됩니다.
An example of using the WebClient
:
WebClient
를 사용하는 예제입니다.
ClientHttpConnector httpConnector = new ReactorClientHttpConnector();
WebClient webClient = new WebClient(httpConnector);
Mono<Account> response = webClient
.perform(get("http://example.com/accounts/1").accept(APPLICATION_JSON))
.extract(body(Account.class));
The above assumes static method imports from ClientWebRequestBuilder
and ResponseExtractors
that enable a fluent syntax. The same can also be done with RxJava using static imports from RxJava1ClientWebRequestBuilder
and RxJava1ResponseExtractors
instead:
위의 내용은 ClientWebRequestBuilder
및 ResponseExtractor
에서 유창한 구문을 사용할 수 있는 정적 메서드를 가져온다고 가정합니다. RxJava는 대신 RxJava1ClientWebRequestBuilder
및 RxJava1ResponseExtractors
에서 정적 가져오기를 사용하여 다음과 같은 작업을 수행할 수도 있습니다.
Single<Account> response = webClient
.perform(get("http://example.com/accounts/1").accept(APPLICATION_JSON))
.extract(body(Account.class));
3 Getting Started
3.1 Spring Boot Starter
The experimental Spring Boot Web Reactive starter available via http://start.spring.io is the quickest way to get started. It does all the work so you can start writing @Controller
classes. By default it runs on Tomcat but the dependencies can be changed as usual with Spring Boot to switch to a different runtime.
http://start.spring.io를 통해 제공되는 실험적인 Spring Boot Web Reactive 스타터는 가장 빠른 시작 방법입니다. 모든 작업을 수행하므로 @Controller
클래스를 작성할 수 있습니다. 기본적으로 Tomcat에서 실행되지만 스프링 부트를 사용하여 종속성을 평소처럼 변경하여 다른 런타임으로 전환할 수 있습니다.
3.2 Manual Bootstrapping
It is also easy to get started by writing a few lines of code:
이 또한 몇개의 코드라인을 적는 것 만으로 쉽게 시작할 수 있습니다.
AnnotationConfigApplicationContext context;
context = new AnnotationConfigApplicationContext();
context.register(WebReactiveConfiguration.class); // (1)
context.refresh();
DispatcherHandler handler = new DispatcherHandler(); // (2)
handler.setApplicationContext(context);
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(handler).build();
HttpServer server = new TomcatHttpServer(); // (3)
server.setPort(8080);
server.setHandler(httpHandler);
server.afterPropertiesSet();
server.start();
The WebReactiveConfiguration
at (1) is the Java config from spring-web-reactive
and is similar in purpose to the MVC Java config from spring-webmvc
. It provides the web framework configuration required to get started leaving you only to declare your own @Controller
beans.
(1)의 WebReactiveConfiguration
은 spring-web-reactive
의 Java 구성으로, spring-webmvc
의 MVC Java 구성과 목적상 유사합니다. 사용자 자신의 @Controller
bean만 선언하면 되는 웹 프레임워크 구성을 제공합니다.
The DispatcherHandler
at (2) is the equivalent of the DispatcherServlet
in Spring MVC.
(2)의 DispatcherHandler
는 스프링 MVC의 DispatcherServlet
에 해당합니다.
The HttpServer
at (3) is an abstraction from the test sources of spring-web-reactive
used for Spring Framework’s own integration tests. The abstraction comes with basic implementations for each supported runtime.
(3)의 HttpServer
는 Spring Framework의 spring-web-reactive
자체 통합 테스트에 사용되는 테스트 소스의 추상화 입니다. 추상화는 지원되는 각 런타임에 대한 기본 구현과 함께 제공됩니다.
3.3 Extent of Support in 5.0 M1 - 5.0 M1에서 지원 범위
For M1 the Spring Web Reactive module focuses on REST scenarios for both client and server. Basic HTML rendering with Freemarker is also supported but limited to rendering but not form submissions.
M1의 경우 Spring Web Reactive 모듈은 클라이언트와 서버 모두에 대한 REST 시나리오에 초점을 맞춥니다. Freemarker를 사용한 기본 HTML 렌더링도 지원되지만, 렌더링으로 제한되며 양식 제출은 지원되지 않습니다.
'개발자의 정보 > Java & framework' 카테고리의 다른 글
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter (0) | 2023.03.01 |
---|---|
spring rest 서비스중 error 응답에서 trace 제거하기 (0) | 2023.02.28 |
spring-framework 에서 error 응답 json 으로보내기 (0) | 2023.02.28 |
Outlook 회의실 API 연동하기 (java example) (0) | 2023.02.08 |
java.util.concurrent.ForkJoinWorkerThread에 대한 Java 코드 예제 (0) | 2020.03.31 |
데이터 과학을 위한 Kotlin (0) | 2020.03.26 |
spring-framework 관련 교육 영상 (0) | 2020.03.19 |
리눅스 서버에서 spring-boot service 등록하기 (0) | 2020.03.09 |
댓글