WebFlux
์คํ๋ง ์ฝ์ด for Reactive
์คํ๋ง 5.0 ์์๋ถํฐ ๋ฆฌ์กํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ์ฌ๋ฌ๊ฐ์ง ํด๋์ค๋ค์ด ์์ , ์ถ๊ฐ๋์๋ค.
ReactiveAdapter, ReactiveAdapterRegistry
RxJava, Reactor ์์ ์ฌ์ฉํ๋ ๋ฐํ์ ํด๋์ค๋ฅผ Publihser ๋ก ๋ณํํด์ฃผ๋ Adapter ๊ฐ springframework.core ์ ์ถ๊ฐ๋์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ก๋ค.
์๋์ฒ๋ผ ReactiveAdapter ๋ฅผ ์์๋ฐ์ RxJava Maybe ์ Publisher ๊ฐ์ ๋ณํ ์์
์ ํด์ฃผ๋ Adapter ๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๊ฑฐ๋
@Component
public class MaybeReactiveAdapter extends ReactiveAdapter {
public MaybeReactiveAdapter() {
/**
* Descriptor for a reactive type that can produce 0..1 values.
* @param type the reactive type
* @param emptySupplier a supplier of an empty-value instance of the reactive type
*/
super(ReactiveTypeDescriptor.singleOptionalValue(Maybe.class, Maybe::empty),
maybe -> ((Maybe<?>) maybe).toFlowable(), // Maybe->Publisher
publisher -> Flowable.fromPublisher(publisher).singleElement()); // Publisher->Maybe
}
}ReactiveAdapterRegistry ๋ฅผ ์ฌ์ฉํด ์ฑ๊ธํด Instance ๋ณ์์ Adapter ์ฉ ์ฝ๋๋ฅผ ์์ฑํด ํ์ํ ๋ ๋ง๋ค ๊บผ๋ด์ด ์ธ ์ ์๋ค.
๋ฆฌ์กํฐ๋ธ I/O, ์ฝ๋ฑ
springframework.core.io ์ ์ ์ฅ๋ DataBuffer, DataBufferUtils ๋ฅผ ์ฌ์ฉํ๋ฉด I/O ์์
์ด ํ์ํ ํ์ผ, ๋คํธ์ํฌ ์์์ผ๋ก ๋ถํฐ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ ํํ๋ก ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค. jav.nio.ByteBuffer ํด๋์ค์ ํ๋ณํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๋ณด๋ค ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
springframework.core.codec ์ ์ ์๋ ์ธํฐํ์ด์ค Encoder, Decoder ๋ฅผ ์ฌ์ฉํ๋ฉด Non Blocking ๋ฐฉ์์ผ๋ก ์ง๋ ฌํ ๋ฐ์ดํฐ๋ฅผ ์๋ฐ๊ฐ์ฒด, ์๋ฐ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ๋ฐ์ดํฐ๋ก ๋ณํ ๊ฐ๋ฅํ๋ค.
WebFlux
Sprinb Boot 2 ์ ๋ฆฌ์กํฐ๋ธ ์น์๋ฒ๋ฅผ ์ํ WebFlux ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์๋๋ก spring-boot-starter-webflux ๋ผ๋ ์๋ก์ด ํจํค์ง๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋์๋ค.
ํด๋น ๋ชจ๋์ Reactive Stream Adapter ์์ ๊ตฌ์ถ๋๋ฉฐ Servlet 3.1+ ์ง์์๋ฒ(Tomcat, Jetty ๋ฑ), Netty, Undertow ์๋ฒ์์ง์์ ๋ชจ๋ ์ง์ํ๋ค.
์์ ์์ง๋ค์
java 8์ ์ถ๊ฐ๋java NIO๋ก ๊ตฌํ๋์ด Http ์์ฒญ์ ๋ ผ๋ธ๋ญํน์ผ๋ก ์ฒ๋ฆฌํ๋ค.

์ผ๋ฐ์ ์ WebMVC ๋ชจ๋๋ Spring 5.0 ์ ์ด๋ฅด๋ฌ spring-boot-starter-web Servlet 3.1 ์์ง์ํ๋ฉด์ ์ผ๋ถ๋ถ์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ ์ง์ํ๊ฒ ๋์๋ค.
ResponseBodyEmitterReturnValueHandler ํด๋์ค๊ฐ ์
๊ทธ๋ ์ด๋ ๋๋ฉด์ ReactiveTypeHandler ํ๋๋ฅผ ์ฌ์ฉํด WebMVC ์ ์ธํ๋ผ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒ ํด์น์ง ์๊ณ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ๋ฐํํ๋ Flux, Mono, Flowable ๋ฑ์ Publisher(๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ)์ ์ฒ๋ฆฌํ๋ค.

๋ฌผ๋ก ์๋ธ๋ฆฟ API ๋ฅผ ์ฌ์ฉํ๊ธฐ์ ๋ธ๋กํน/์ค๋ ๋ํ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
WebFlux ๊ฐ์
๊ธฐ์กด WebMVC ๋ชจ๋ธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.

ViewResolver๋Rest๋ฐฉ์์์ ์๋ต๋๋ค.
๊ฐ์ข
์๋ธ๋ฆฟ ์ปจํ
์ด๋(Tomcat, JBoss ๋ฑ) ์์ฒญ์ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์์ํ DispatcherServlet ์ด ์คํ๋ง ๋ถํธ ์ปจํธ๋กค๋ฌ ๋งคํ์ ๋ฐ๋ผ ์์ฒญ์ ๋ถ๋ฐฐํ๋ค.
๊ทธ๋ฆผ์ฒ๋ผ ๊ธฐ์กด WebMVC ๋ฐฉ์์ ๋๊ธฐ/๋ธ๋กํน ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
์คํ๋ง ๋ถํธ์์ ๋ฆฌ์กํฐ๋ธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ค๋ฉด Servlet 3.1+(Tomcat, Jetty ๋ฑ), Netty, Undertow ์ ๊ฐ์ ์๋ฒ๋ฅผ ์ฌ์ฉํด ๋ฆฌ์กํฐ๋ธํ๊ฒ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋๋ฐ
๋คํ์ด๋ ์คํ๋ง ํ๋ก์ ํธํ์ด ๋์ผํ ์ด๋
ธํ
์ด์
๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด์ ๋น๋๊ธฐ/๋
ผ๋ธ๋กํน ์ผ๋ก ๋์ํ๋๋ก ์ด๋ฏธ ๊ฐ๋ฐํด๋์๋ค.
WebFlux with Flux
๋๋ต์ ์ผ๋ก WebFlux ์์ Http Request, Response ์ด๋ป๊ฒ ๋ฆฌ์กํฐ๋ธ๋ก ๊ตฌํํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ก ํ์ธํ ์ ์๋ค.
์๋ธ๋ฆฟ์ ServletRequest, ServletResponse ์ ์ฐ๊ด์ง์ด์ ์๋ก์ด Http ์์ฒญ, ๋ฐํ์ ๊ฐ์ฒด๋ก ํํํ ์ ์๋ ์ธํฐํ์ด์ค๋ค์ด ์ ์๋์ด์๊ณ
DataBuffer ๋ฅผ ์ฌ์ฉํด ๋ฆฌ์กํฐ๋ธ ํ์
๊ณผ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
WebHandler ๋ DispatcherServlet ์ญํ , ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ง ๋ชปํ ์ ์์์ผ๋ก handle ๋ฉ์๋๋ Mono<Void> ๊ฐ ๋ฐํ๋๋ค.
ํด๋ผ์ด์ธํธ๋ฅผ ์ํ Http ๋ฐํ์
exchange์์ServerHttpResponse์
WebFilter ๋ ์๋ธ๋ฆฟ์ ์์ฒญ, ๋ฐํ ํํฐ์ฒ๋ผ ๋ฆฌ์กํฐ๋ธ์์๋ ๋น์ง๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ํํฐ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ค.
๋ง์ง๋ง์ผ๋ก WebHandler ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ exchange ๊ฐ์ฒด๋ฅผ url ๋งคํํ ์ ์๋๋ก HttpHandler ์ handle ๋ก ์ ๋ฌ๋๋ค.
WebFlux - Functional Reactive Web Server
Vert.x ๋ Ratpack ๊ณผ ๊ฐ์ ํ๋ ์์ํฌ์ ์ธ๊ธฐ๋น๊ฒฐ์ ์คํ๋ง์ ๋ณต์กํ MVC ์ค์ ์ผ๋ก ๋ผ์ฐํ
์ค์ ๊ณผ ๋ก์ง์ด ์์ด
๊ฐ๊ฒฐํ ์ค์ ์ผ๋ก ๋ผ์ฐํ
๋ก์ง์ ์์ฑํ ์ ์๋ API ๋ค์ด ์ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ์ ํ๋ ์์ํฌ์ฒ๋ผ ๊ฐ๊ฒฐํ๊ฒ ๋ผ์ฐํ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์๋ API ๋ฅผ ๊ฐ๋ฐํ์๋ค.
spring-boot-starter-webflux ๋ชจ๋์ org.springframework.web.reactive.function.server ํจํค์ง์ ์ ์๋ RouterFunction ํด๋์ค ์ฌ์ฉํ์ฌ ๋ผ์ฐํ
๋ก์ง ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
RouterFunction ์ ์คํ๋ง Bean ์ผ๋ก ๋ฑ๋กํ๊ณ /orders ์ ๋ํ ๋ผ์ฐํ
๋ก์ง ์ค์ , ๊ธฐ๋ณธ์ ์ธ Path, Http method, cookie ํฌํจ์ฌ๋ถ ๋ฑ ์ฌ๋ฌ ๋ก์ง์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
ํจ์ํ์ผ๋ก ์น์๋ฒ๋ฅผ ๊ตฌ์ถํ ๊ฒฝ์ฐ Netty ์๋ฒ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋ณ๋์ ์คํ๋ง ์ค์ ์์ด ์๋ฒ ์คํ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฐ์ ๋๋ฌธ์ ๋จ์ ํ
์คํธ์ ๊ฒฝ์ฐ @SpringBootApplication ์ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ Netty ์๋ฒ๋ฅผ ์ฌ์ฉํด ๋น ๋ฅด๊ฒ ์๋ฒ๋ฅผ ์คํํ๊ณ ๊ตฌํํ ๋ฉ์๋๋ค์ ํ
์คํธ ํ ์ ์๋ค.
๋ง์ฝ ํจ์ค์๋ ์ํธํ ๋ฐ ๋ณตํธํ ํ
์คํธ๋ฅผ ํ๋ค๋ฉด ์๋ฒ๊ธฐ๋ฅ์ ํ๋ ๊ฐ์ฒด ์ธ์ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ฐ์ฒด๋ ํด์ ๊ธฐ๋ฅ์ด ์๋ spring-boot-starter-security ์ PasswordEncoder ๋ฟ์ด๋ค.
PasswordEncoder๋ง ์ฌ์ฉํ๋ค๋ฉดspring-security-core๋ง ์์กด์ฑ ์ฒ๋ฆฌํด๋ ๋๋ค.
๋ณ๋์ ์คํ๋ง ๊ด๋ จ ์ด๋
ธํ
์ด์
, Bean ๋ฑ๋ก๊ณผ์ ์์ด RouterFunction, Netty, PasswordEncoder 3๊ฐ ๊ฐ์ฒด๋ง ์ ์ ์ํด์ ์๋์ฒ๋ผ ์๋ฒ ์คํ์ด ๊ฐ๋ฅํ๋ค.
์๋ฒ๊ฐ 0.7 ์ด๋ง์ ์คํ๋๋ค. ์คํ๋ง ์ปจํ ์ด๋, ์์กด์ฑ ์ฃผ์ , ์ด๋ ธํ ์ด์ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์์ผ๋ก ์๋๊ฐ ๊ต์ฅํ ๋น ๋ฅด๋ฉฐ ๊ฐ๋จํ ํ ์คํธ์งํ์ ์์๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ํธํ๋ค.
WebFlux - Annotated Controller
RouterFunctions๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง WebMVC ๋ชจ๋ธ์์ ์ฌ์ฉํ๋ @RestController, @RequestMapping ๋ฑ์ ์ด๋
ธํ
์ด์
์ WebFlux ์์๋ ์ฌ์ฉํ ์ ์๋ค.
Flux ๋ ๋ฐฐ์ด, Mono ๋ ๊ฐ์ฒด๋ก ๋ฐํ๋๋ค.
WebFlux - Filter
๋์ด์ javax.servlet.Filter ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
ํํฐ๊ธฐ๋ฅ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๋ค.
RouterFunctions
WebFilter
๋ณ๋์ ๋งคํ ์กฐ๊ฑด์ด ์๊ธฐ๋๋ฌธ์ ์กฐ๊ฑด๋ฌธ ๋ถ๊ธฐ๊ฐ ํ์ํจ
HandlerFilterFunction
WebFlux - Exception Handler
๋ฉ์๋ ๋ ๋ฒจ์์ ์ค๋ฅ์ฒ๋ฆฌ๋ ServerResponse ์ status, body ๋ฑ์ ์ค์ ํ๋ฉด ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ํ ํด๋์ค ๋ด๋ถ์์ ๊ธฐ์กด WebMVC ์์ ์ฌ์ฉํ๋ @ExceptionHandler ๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ ์ ์๋ค.
๊ธ๋ก๋ฒ ๋ ๋ฒจ์์ ์ค๋ฅ์ฒ๋ฆฌ๋ WebExceptionHandler ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ํํฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
DefaultErrorAttributes
DefaultErrorAttributes ๋ WebFlux ์์ ์ฌ์ฉํ๋ ์๋ฌ ํธ๋ค๋ฌ๋ก ๊ธฐ๋ณธ ํํฐ๋ก ๋ฑ๋ก๋์ด ์๋ ์๋ฌ ํธ๋ค๋ฌ๊ฐ DefaultErrorAttributes ์์ getErrorAttributes ๋ฅผ ํธ์ถํด ์๋์ ๊ฐ์ ๋ฐํ๊ฐ์ ๋ฐํํ๋ค.
๊ธ๋ก๋ฒ ๋ ๋ฒจ์์ ์ค๋ฅ์ฒ๋ฆฌ๋ฅผ ํตํด ์ปค์คํ
ํ ๋ฐํ๊ฐ์ ์ค์ ํ๊ณ ์ถ์ผ๋ฉด DefaultErrorAttributes ์ getErrorAttributes ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ผํ๋ค.
์๋ฌ ๋ฐํ์ ์๋์ฒ๋ผ ์ถ๋ ฅ๋๋๋ก ์ค์
์ด์ ํธ๋ค๋ฌ์์ DefaultErrorAttributes ์ getErrorAttributes ๊ฐ ์๋
์ง์ ์ ์ํ GlobalErrorAttributes ์ getErrorAttributes ๊ฐ ํธ์ถ๋๋๋ก ์ค์ ํ๋ฉด ๋๋ค.
AbstractErrorWebExceptionHandler
AbstractErrorWebExceptionHandler ๋ ์๋ฌ๋ฐ์์ ํํฐ๋ก ๋ฑ๋ก๋์ด ์๋ ํธ๋ค๋ฌ
ํด๋น ํธ๋ค๋ฌ๋ณด๋ค ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํธ๋ค๋ฌ๋ก ์๋ฌ์ฒ๋ฆฌํ๋๋ก ์ค์
WebFlux - WebSocket
์ด๋ฏธ spring-boot-starter-websocket ๋ชจ๋์์ ์ ๊ณตํ๋ ์คํ๋ง ์น์์ผ์ ํตํด ๋
ผ๋ธ๋กํน์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ ์ค ์์์ง๋ง ๋ด๋ถ์์ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ ๋ฆฌ์กํฐ๋ธ ์๋ฒ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น๋ค
WebFlux ์์ ๋น๋๊ธฐ/๋
ผ๋ธ๋กํน ๋ฐฉ์์ ์น์์ผ ์ฒ๋ฆฌ๋ฅผ ์ํด org.springframework.web.reactive.socket ํจํค์ง๋ฅผ ์ ๊ณตํ๋ค.
ํจํค์ง์
reactive๊ฐ ๋ถ์๋ฟ ํด๋์ค๋ช ์ด๋ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ์ ์ฌํ๋ค.
์น์์ผ ์๋ฒ, ์น์์ผ ํด๋ผ์ด์ธํธ ๋ชจ๋ ์ ๊ณตํ๋ค.
์น์์ผ ์๋ฒ๋ WebSocketHandler ๋ฅผ ์ฌ์ฉํด ์์ผ ํธ๋ค๋ฌ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ธ Handler ๋ฅผ ๋ฑ๋กํ๋ค.
์น์์ผ์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ์น์์ผ ์ค์ ๊ฐ์ฒด๋ฅผ Bean ์ผ๋ก ๋ฑ๋กํด์ผ ํ๋ค.
์์์ ์ ์ํ ํธ๋ค๋ฌ๋ฅผ url ์ ๋งคํํ๊ณ , Request ์์ฒญ์ Upgrade ํ๋ ์ด๋ํฐ๋ฅผ Bean ์ผ๋ก ๋ฑ๋กํ๋ค.
WebSocketMessage๋payload๋กDataBuffer๋ฅผ ๊ตฌํํ์ฌ ๋ฌธ์์ด, ๋ฐ์ดํธ์ฝ๋๋ก ์ฝ๊ฒ ํ๋ณํ ๊ฐ๋ฅ
WebSocketHandler ๋ฅผ ๊ตฌํํ๋ฉด ํด๋น url ์ ํด๋นํ๋ WebSocketSession ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ฉ์ธ์ง๋ฅผ ๋ฐ๊ณ ๋ณด๋ธ๋ค.
์น์์ผ ํ
์คํธ ํด์ ์ฌ์ฉํด ws://127.0.0.1:8080/ws/echo ๋ก ์ ์, ๋ฉ์ธ์ง ์ ์ก์ Echo: ... ๋ฉ์ธ์ง ์์ ํ์ธ
WebSocket Client
์น์์ผ ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ WebSocketClient ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ReactorNettyWebSocketClient ๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ํด๋ echo ์น์์ผ ์๋ฒ์ 0.1 ์ด๋ง๋ค interval ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ์ ์ก
client ์ญ์ WebsocketHandler ๊ตฌํ์ฒด๋ฅผ excute ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ผ๋ฉฐ ํธ๋ค๋ฌ ๋งคํ๊ณผ ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ Bean ์ผ๋ก ๋ฑ๋ก๋์ง ์์ ๋ฟ ์น์์ผ ์๋ฒ ์ฝ๋์ ์ ์ฌํ๋ค.
์ฐธ๊ณ ์ฝ๋: https://github.com/Kouzie/spring-reactive/tree/master/spring-reactive-websocket-client ์ํ๊น๊ฒ๋
WebFlux์์ ์ ๊ณตํ๋ ์น์์ผ ๋ด์ฉ์ ์์ ๊ธฐ๋ฅ์ด ์ ๋ถ์ด๋ฉฐ STOMP ๋ฅผ ์ฌ์ฉํ ๋ฉ์ธ์ง ๋งคํ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค.
๋ค์ค ํต์ Sinks.Many
์ฝ๋ ์ฐธ๊ณ : https://github.com/Kouzie/spring-reactive/tree/master/spring-reactive-websocket
๋ฆฌ์กํฐ๋ธ์ ์น์์ผ์ WebMVC ์์ ์ฌ์ฉํ ์น์์ผ๊ณผ ๋ค๋ฅธ์ ์ด ์๋๋ฐ ๋ชจ๋ ์์ฒญ์ ๋ํ ์๋ต์ ์ํํ ๋ ์์๊ฐ์ด ๋๋ค์์ด๋ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํด๋์ด์ผ ํ๊ณ
๋๊ฐ ์ด์์ ํด๋ผ์ด์ธํธ๋ค๊ฐ ํต์ ์ ์ํด์ ๊ฐ ํด๋ผ์ด์ธํธ์ session ์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋๋ฐ Sinks.Many ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
์น์์ผ ์ค์ ๊ฐ์ฒด๋ฅผ Bean ์ผ๋ก ๋ฑ๋กํ๊ณ ํธ๋ค๋ฌ ๋งคํํ๋ ๊ฒ์ ๋์ผํ๋ค.
session.send ์ ๋ฑ๋ก๋๋ Flux ๋ฐํ์๋ Sinks.Many ๋ก๋ถํฐ ์์ฑ๋๋๋ฐ
์ด๋ ์๋์์ ์ฌ์ฉํ๋ ์ฝ๋์ ๊ฐ์ด ๋ฉ์ธ์ง๋ฅผ ์ง์ด๋ฃ์ ์ ์๋ ๋ฐํ์๋ค.
Websocket ์ธ์๋ SSE (Server Send Events) ์์๋ ์ฌ์ฉ๋๋ค.

WebClient
๋
ผ๋ธ๋กํน Http Client๋ก ๊ธฐ์กด ์คํ๋ง ๋ถํธ์์ ๋ํ์ ์ธ Http Client ๋ก RestTemplate(๋ธ๋กํน) ์ด ์๋ค.
๋ด๋ถ์ Flux, Mono ๋ฆฌ์กํฐ ๊ฐ์ฒด๋ฅผ ์ง์ํ๋ ๋งคํ์ด ๋ด์ฅ๋์ด ์์ด ๋ฆฌ์กํฐ๋ธ ์๋ฒ์ ์ ์ด์ธ๋ฆฐ๋ค.
http://localhost:8080/api/user/{id} url ์ ์ง์ํ๋ ๊ฐ๋จํ ์น์๋ฒ ์์ฑ
WebClient ๋ฅผ ์ฌ์ฉํด ์ url ์ Http GET Request ์์ฒญ
์์ WebClient ๋ GET ๋ฐฉ์์ด๋ผ uri ๋ง ์ค์ ํ์ง๋ง API ์ ๋ฐ๋ผ cookie, header, body ๋ชจ๋ ์ค์ ๊ฐ๋ฅํ๋ค.
HTTP ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์๋๊ฐ retrieve() ์ exchage() ๊ฐ ์๋๋ฐ
retrieve() ๋ ResponseSpec ์ ๋ฐํํ๊ณ exchage() ๋ Mono<ClientResponse> ๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ exchange() ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ฝ๋์์ฑ
exchage ๋ฅผ ์ฌ์ฉํ๋ฉด ClientResponse ์์ ์ ๊ณตํ๋ Http Response ์ ๊ฐ์ข
์ ๋ณด๋ฅผ ์กฐ์ํ ์ ์๋ ์ฌ๋ฌ ๋ฉ์๋๋ก ๋ณต์กํ ๋ฐํ ๋ก์ง ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
retrieve ์ ๊ฒฝ์ฐ Http status ๋ง ๊ฒจ์ฐ ์กฐ์ํ์ฌ DSL ํ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
WebClient ๋ ์ธํฐํ์ด์ค์ด๊ณ DefaultWebClient ๊ฐ WebClient ์ ์ ์ผํ ๊ตฌํ์ฒด์ด๋ค.
์ค์ DefaultWebClient ๋ด๋ถ์์
WebClient Serialize config
WebClient ์์ ์ง๋ ฌํ, ๋น์ง๋ ฌํ๋ฅผ ์ํํ ๋ ๊ธฐ์กด์์ฑํ ObjectMapper ๋ฅผ ํตํด ์ฒ๋ฆฌํ ์ ์๋ค.
์ฃผ์์ฌํญ์ผ๋ก uri(uriBuilder->..) ๋ฉ์๋๋ฅผ ์ฌ์ฉํด query parameter ๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ ๋ฌธ์์ด์ / ๊ฐ ๋ค์ด๊ฐ escape ๋ฌธ์๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ base64 ๋ฌธ์์ด๋ก ๋ณํํ ์ ์๋ค, url encoding ์ ์งํํ์ง ์๋๋ค. ๋ํ WebClient ์์ฑ์ baseUrl ์ ์ค์ ํ์ง ์์ผ๋ฉด uribuilder ๋ฅผ ํตํด scheme, host, port, path ๋น๋ํจ์๋ฅผ ๋ชจ๋ ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๋ค.
WebClient ๋ฅผ bean ์ผ๋ก ์์ฑํด singleton ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด StringBuilder ๋ฅผ ํตํด uri ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅ.
SSE(Server-Sent Event)
์ฐธ๊ณ : https://www.youtube.com/watch?v=4HlNv1qpZFY&t=1283s ํ๋ฒํ
HTTP, Websocket, SSE ํ๋กํ ์ฝ์ ์ํ์ค ๋น๊ต์ด๋ค.
์๋ฒ ๋จ๋ฐฉํฅ ํต์ ์ด๋ผ ์น์์ผ์ด ๋นํด ์๋๋ ์ค๋ฒํค๋ ์ธก๋ฉด์์ SSE ๊ฐ ํจ์จ์ ์ด์ง๋ง ์๋ฐฉํฅ์ด ์๋๋ ์ด์ ๋ก ์น์์ผ์ด ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
WebFlux ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ spring-boot-starter-web ์์ SSE ํ๋กํ ์ฝ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ScheduledExecutorService ์ ApplicationEventPublisher ํด๋์ค๋ฅผ ์ฌ์ฉํด Temperature ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ฐํํ๋ค.
@EventListener ๋ฅผ ์ฌ์ฉํด ApplicationEventPublisher ์ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
SseEmitter ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ง, ๊ด๋ฆฌํ๋ค. ๋ฐํ ํ์
์ด ResponseEntity, Map ๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ SseEmitter ์ธ ๊ฒ์ด ์ด์ํ๋ค.
WebFlux ์์ Flux ์ Spring 5.0 ์ ์ถ๊ฐ๋ ServerSentEvent ๋ฅผ ์ฌ์ฉํด SSE ํ๋กํ ์ฝ์ ์ง์ํ๋ค.
WebFlux ๋ด๋ถ์์ ๋ฐํ์์๋ฅผ ServerSentEvent ๋ก ๋ํ ํ๊ธฐ์ ๋จ์ Flux<> ๋ง ์ปจํธ๋กค๋ฌ ๋ฉ์๋์์ ๋ฐํํด๋ ๋๋ค.
์คํ๋ง ์ํ๋ฆฌํฐ with WebFlux
๊ธฐ์กด ์๋ธ๋ฆฟ ๊ธฐ๋ฐ ์คํ๋ง ๋ถํธ๋ ํ๋์ ์ค๋ ๋์ ํ๋์ ์ฐ๊ฒฐ์ด ์ฒ๋ฆฌ๋์ด
ThreadLocal ์ SecurityContext ๋ฅผ ์ ์ฅํด ์ฐ๊ฒฐ๋์ ๋ณด์์ฒ๋ฆฌ๋ฅผ ์งํํ์ง๋ง
๋ฆฌ์กํฐ๋ธ๋ ํ๋์ ์ฐ๊ฒฐ์ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ๊ผฌ์ฌ์์ ์ ์์ด Reactor Context ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
spring-boot-starter-security ๋ชจ๋ ์ญ์ ๊ธฐ์กด ์๋ธ๋ฆฟ ๊ธฐ๋ฐ WebMVC ์์ WebFlux ๋ฅผ ์ง์ํ ์ ์๋๋ก ์
๋ฐ์ดํธ ๋์๋ค.
ReactiveSecurityContextHolder
WebMVC ์์ SecurityContextHolder ์์ SecurityContext ๋ฅผ ๊ฐ์ ธ์๋ค๋ฉด
WebFlux ์์ ReactiveSecurityContextHolder ์์ SecurityContext ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋ก๊ทธ์ธํ ์ ์ ์ ์ ๋ณด๋ฅผ SecurityContext ๊ฐ์ ธ์ Profile ์์ ๊ฒ์ ํ ์ถ๋ ฅํ๋ค.
๋น์ฐํ SecurityContext::getAuthentication ๋ฉ์๋๋ ๋ฆฌ์กํฐ ์ปจํ
์คํธ ๋ฅผ ์ฌ์ฉํ๋ค.
SecurityWebFilterChain
์ธ์ฆ๊ณผ์ ์ ๊ฑฐ์น๋ ค๋ฉด ๋ด๋ถ ์ปจํ
์คํธ์ ์์ธ์ค ํ๋ ค๊ณ ํ๋ฉด SecurityContext ๊ฐ ํด๋น ๋ฆฌ์กํฐ ์ปจํ
์คํธ ์ ์กด์ฌํด์ผํ๊ณ Authentication ๊ฐ์ฒด๊ฐ SecurityContext ์์ ํ ๋น๋์ด์ผ ํ๋ค.
์ด ๋ชจ๋ ๊ณผ์ ์ ReactorContextWebFilter ์ SecurityWebFilterChain ์ ์ฉํ๊ณ ์ด๋ฅผ ํตํด ๋ฆฌ์กํฐ ์ปจํ
์คํธ ์์ SecurityContext ๊ฐ์ฒด์ Authentication ๊ฐ์ฒด๋ฅผ ์ง์ด๋ฃ๋๋ค.
SecurityContext ๋ฅผ ์ง์ด ๋ฃ๋ ํจ์๋ ServerSecurityContextRepository ๋ฅผ ์ฌ์ฉํ๋ค.
SecurityContext ๋ฅผ ํน์ ServerWebExchange์ ์ ์ฅ, ์ฌ์ฉํ ์ ์๋ค.
WebFlux with JWT
Custom SecurityContextRepository, AuthenticationManager
์คํ๋ง ์ํ๋ฆฌํฐ๋ SecurityContextRepository ๋ฅผ ํตํด SecurityContext ๋ฅผ ๋ฆฌ์กํฐ ์ปจํ
์คํธ์ ์ ์ฅํ๊ณ ์ญ์ ํ๋ค.
default ์คํ๋ง ์ํ๋ฆฌํฐ์ ๊ฒฝ์ฐ DB ๋ก๋ถํฐ UserDetails ๋ฅผ ๊ฐ์ ธ์ ๋ฑ๋กํด๋๊ณ ์ฌ์ฉํ๊ฒ ์ง๋ง ์ฐ๋ฆฌ๋ JWT ๋ฅผ ์ฌ์ฉํ๊ธฐ์ ServerSecurityContextRepository ์์๋ฐ์ ์ปค์คํฐ๋ง์ด์ง ํด์ผํ๋ค.
SecurityContext ๋ฅผ ์์ฑ ๋ฐ ์ ์ฅํ๊ธฐ request ํค๋๋ก ๋ถํฐ JWT ํ ํฐ์ ๊ฐ์ ธ์ AuthenticationManager๋ก ๋๊ธฐ๋ ์ฝ๋๊ฐ load ์ ์ ์๋์ด ์๋ค.
AuthenticationManager ๋ ์ ๋ฌ๋ฐ์ ํ ํฐ์ผ๋ก role ์ ๊บผ๋ด์ด Authority ๋ฅผ ์ง์ ํ๊ณ Authentication ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
SecurityContextPath ๊ฐ ๋ฆฌ์กํฐ ์ปจํ
์คํธ๋ก ๋ณ๊ฒฝ๋์์ ๋ฟ ๊ธฐ์กด WebMVC ๋ชจ๋ธ์ ์คํ๋ง ์ํ๋ฆฌํฐ ๋ฐฉ์๊ณผ ๋น์ทํ๋ค.
๋ง์ง๋ง์ผ๋ก ServerHttpSecurity ์ ์ปค์คํฐ๋ง์ด์งํ SecurityContextRepository, AuthenticationManager ๋ฅผ ๋ฑ๋กํ๊ณ ๋ณ๋์ ์๋ฌ ํธ๋ค๋ง ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ์๋ฌ๋ฅผ ๋ฐํํด ํธ๋ค๋ง,
์๋ค๋ฉด HttpStatus.UNAUTHORIZED ๋ก ๋จ์ HTTP Status ๋ง ๋ฐํํ ์ ์๋ค.
์คํ๋ง ๋ฐ์ดํฐ with WebFlux
๊ธฐ์กด์ WebMVC ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ JDBC ๋ฅผ ๊ตฌํํ ๋๋ผ์ด๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฅผ ์ฌ์ฉํด ์ ๊ทผํด์๋ค.
๋ฆฌ์กํฐ๋ธํ DB ํต์ ๋ HTTP ์ ๋ค๋ฅด์ง ์๋ค.
์ด๋ก ์ ์ผ๋ก DB ์ ๊ทผ์ฉ ์๋น์ค๋ฅผ ์์ฑํ๊ณ WebClient ๋ฅผ ์ฌ์ฉํด DB ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๋ฉด ๋น๋๊ธฐ DB ์ ๊ทผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌํํ ๊ฒ ๊ณผ ๋ค๋ฆ์๋ค.
๋คํ์ด๋ ๋ค์ํ DB ๋ฒค๋์ฌ์์ ์๋ฐ ๋น๋๊ธฐ DB ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ๋ฅผ ์ ๊ณตํจ์ผ๋ก ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ถ๊ฐํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ด์ด์ ๋ํ ๋
ผ ๋ธ๋กํน ์์ธ์ค๋ฅผ ํ ์ ์๋ค.
spring-boot-starter-data-mongodb-reactive
spring-boot-starter-data-cassandra-reactive
spring-boot-starter-data-redis-reactive
spring-boot-starter-data-r2dbc
์คํ๋ง ๋ฐ์ดํฐ ํ์์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ Repository ํจํด์ ๋ฆฌ์กํฐ๋ธ ๋ฐฉ์์๋ ๋๊ฐ์ด ์ฌ์ฉํ ์ ์๋๋ก ์ถ์ํ๋ฅผ ํตํด ๊ตฌํํด๋์๋ค.
๊ฐ ๋ชจ๋๋ค์ด ReactiveCurdRepository ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด Reactor ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉ๋์ด ์์ฐ์ค๋ฝ๊ฒ ๋ฆฌ์กํฐ๋ธํ๊ฒ ์ฝ๋์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์คํ๋ง ๋ฐ์ดํฐ ๋ชฝ๊ณ DB ๋ฆฌ์กํฐ๋ธ
NoSQL ์ ๊ฒฝ์ฐ ๊ฐ ๋ฒค๋์ฌ์์ ํตํฉ๋ ๊ท์ฝ์ด ์๋ค.
๊ฐ ๋ฒค๋์ฌ์์ ์๊ธฐ๋ค๋ง์ ๋๋ผ์ด๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์คํ๋ง ๋ฐ์ดํฐ ํ์ ์คํ๋ง์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์ข
๋ชจ๋์ ๊ฐ๋ฐํ๊ณ ์๋ค
NoSQL DB ๋ ์ต๊ทผ์ ๋ง๋ค์ด ์ ธ์ ๋๋ถ๋ถ ๋ฒค๋์ฌ๊ฐ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ ๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ
์คํ๋ง ๋ฐ์ดํฐ ํ์ ๋ชฝ๊ณ DB ์์ ์ ๊ณตํ๋ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ ๋ฅผ ์ฝ๊ณ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก spring-boot-starter-data-mongodb-reactive ๋ชจ๋์ ์์ฑํด๋์๋ค.
ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ํ์์ ๋ง๋ Repository ํจํด์ ์ฌ์ฉํด ๋ฉ์๋๋ช
๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ด ์๋ ์์ฑ/์ฌ์ฉ ํ ์ ์๋ค.
ReactiveMongoRepository
ReactiveMongoTemplate
ReactiveMongoRepository ์ธ์๋ ReactiveMongoTemplate ๋ฅผ ์ฌ์ฉํด ์ฟผ๋ฆฌ ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
MongoClient
๋ชฝ๊ณ DB ์์ ์ ๊ณตํ๋ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ ๊ตฌํ์ฒด๊ฐ com.mongodb.reactivestreams.client.MongoClient ํด๋์ค์ด๋ค.
https://mongodb.github.io/mongo-java-driver-reactivestreams/
org.mongodb:mongodb-driver-reactivestreams ๋ชจ๋์์ ์ ๊ณตํ๋ฉฐ spring-boot-starter-data-mongodb-reactive ์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
MongoClient ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ ์ฟผ๋ฆฌ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
ํธ๋์ญ์
(ReactiveMongoTemplate.inTransaction)
MongoDB 4.0 ๋ฒ์ ์ด์ ๊น์ง ํ๋์ ๋ฌธ์ ์ ๋ํด์๋ง ํธ๋์ญ์
์ ์ ๊ณตํ๋ Single-Document Transaction ๊ธฐ๋ฅ๋ง ์์๋ค.
ํ๋์ ๋ฌธ์์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฝ์
ํ์ฌ ์ฌ์ฉํ๊ธฐ์ ํ๋์ ํธ๋์ญ์
์ ํ๋์ ๋ฌธ์๋ง ๊ฑด๋ค์ฌ์ Single-Document Transaction ์ผ๋ก๋ ์ถฉ๋ถํด์ผ ํ์ง๋ง ํญ์ ์์ธ๊ฐ ์๋๋ฒ,
๊ฒฐ๊ตญ ์ฌ๋ฌ ๋ฌธ์์ ๋ํ ํธ๋์ญ์
Multi-Document Transaction ๊ธฐ๋ฅ์ MongoDB 4.0 ๋ถํฐ ์ง์ํ๋ค.
WiredTiger ์คํ ๋ฆฌ์ง ์์ง์ ์ค๋ฉ์ค์ ์ด ๋์ด ์์ง ์๊ณ ๋ณต์ ์ค์ ์ผ ๊ฒฝ์ฐ์๋ง
Multi-Document Transaction์ ์ง์ํ๋ค.
ReactiveMongoTemplate ์ inTransaction ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด
์คํ๋ง ๋ฐ์ดํฐ R2DBC
R2DBC: Reactive Relational Database Connectivity
https://r2dbc.io/ https://spring.io/projects/spring-data-r2dbc https://spring.io/projects/spring-data-r2dbc
์๋์ ๊ฐ์ DBMS ์ ๋ํ์ฌ r2dbc ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณต
์ง๊ธ๊น์ง ์คํ๋ง JDBC ํน์ ์คํ๋ง ๋ฐ์ดํฐ JDBC ํน์ JPA ๋ฅผ ์ฌ์ฉํด ์์ฑ๋ Hikari CP ์์ ์ฐ๊ฒฐ๊ฐ์ฒด๊ฐ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํด ๊ด๊ณํ DB ๋ฅผ ์ฌ์ฉํด ์๋ค.
JDBC, JPA ๋ฑ์ ๊ด๊ณํ DB ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ชจ๋ ๋๊ธฐ/๋ธ๋ญํน ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋คํ์ด๋ spring data jdbc ๋ฅผ ๊ฐ๋ฐํ ์คํ๋ง ๋ฐ์ดํฐ Relational ํ๋ก์ ํธ ํ์์
๋ฆฌ์กํฐ๋ธ์ ์ ํฉํ ์๋ฐ DB ๋๋ผ์ด๋ฒ์ธ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ๋ฅผ ๊ฐ๋ฐ์ค์ด๋ค.
์ด ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ ๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ๊ฐ R2DBC ํ๋ก์ ํธ์ด๋ค.
๋์ด์ JDBC ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฆฌ์กํฐ๋ธ ์คํ์ ์ ํฉํ ๋ฆฌ์กํฐ๋ธ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํด DB ์ ์ ๊ทผ, ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ค.
์ํ๊น๊ฒ๋
JPA๋ ๊ธฐ์กด ์ฝ๋๊ฐ ๋๋ฌด ๋ณต์กํ๋์ง ๋ฆฌ์กํฐ๋ธ ์ง์์ ํ์ง ์์๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ReactiveCrudRepository
R2dbcEntityTemplate
์คํ๋ง ๋ฐ์ดํฐ Redis
spring-boot-starter-data-redis-reactive ๋ชจ๋์ ์ฌ์ฉ ReactiveRedisTemplate ํด๋์ค๊ฐ Redis ์ปค๋ฅ์
์ ํต์ฌํด๋์ค์ด๋ค.
๋ค๋ฅธ ์คํ๋ง ๋ฐ์ดํฐ ํ๋ก์ ํธ์ ๋ฌ๋ฆฌ
Repository๊ฐ ์กด์ฌํ์ง ์์ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ธ์๋ ๊ตฌ๋ /๋ฐํ ๊ตฌ์กฐ์ ๋ฉ์์ง ๊ธฐ๋ฅ๋ ์ง์ํ๋ค.
spring-boot-starter-data-redis-reactive๋ชจ๋์ ๋ด๋ถ์ ์ผ๋กLettuce๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
https://lettuce.io/, ํ์ฌ non blokcing ์ ์ง์ํ๋ redis ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Lettuce ๊ฐ ์ ์ผํ๋ค. ๋ํ
Lettuce๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์Reactor๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐํ
ListenableFuture
์คํ๋ง์์ ์ ๊ณตํ๋ Future ๊ตฌํ ํด๋์ค
์์ SseEmitter ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋ง ๋ฆฌ์กํฐ๋ธ์ ๋ฐํ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋๋ค.
AsyncRestTemplate.execute ๊ฐ ๋ฐํํ๋ ListenableFuture ๋ฅผ CompletionStage ๋ก ๋ณํ ๋ฐํ๋ CompletionStage ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋ค์ ๋ฐํ๋ CompletionStage ๋ฅผ ListenableFuture ๋ก ๋ณํํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋จํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ Future ๋ฅผ ๊ตฌํํ CompletableFuture(CompletionStage ๊ตฌํ์ฒด) ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋ฉ์๋ ์ ์์ ๋ฐํ๊ฐ์ ์คํ๋ง์์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ListenableFuture ๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ก ๋ฐํํ๊ธฐ ํ๋ค๊ธฐ์
์์๊ฐ์ AsyncAdapters ๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ListenableFuture ๋ก ๋ณํํด์ฃผ๋ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ๋ค.
AsyncRestTemplate
์คํ๋ง ๋ฆฌ์กํฐ๋ธ์์ ๋๊ธฐ๋ฐฉ์์ธ ์ผ๋ฐ RestTemplate ์ ์ฌ์ฉํ์ง ์๊ณ AsyncRestTemplate ๋ฅผ ์ฌ์ฉํ๋ค.
ํํ์ฌ์ฉํ๋ execute ๋ฉ์๋์ ๋ฐํ๊ฐ์ด ListenableFuture ๊ฐ์ฒด์ด๋ค.
Last updated
