Spring WebFlux ๊ฐ์
Spring 5.0๋ถํฐ ์ง์ํ๋ ๋ฆฌ์กํฐ๋ธ ์น ํ๋ ์์ํฌ๋ก, ์ ์ ์์ ์ค๋ ๋๋ก ๋๋์ ์์ฒญ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋น๋๊ธฐ Non-Blocking I/O ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Spring WebFlux ๊ธฐ์ ์คํ
โณ๏ธ Spring MVC์ Spring WebFlux ๊ธฐ์ ์คํ ๋น๊ต
๐ท ์๋ฒ
- Spring MVC
- ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ
- Apache Tomcat๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ Blocking I/O ๋ฐฉ์์ผ๋ก ๋์
- Spring WebFlux
- Non-Blocking I/O ๋ฐฉ์์ผ๋ก ๋์ํ๋ Netty ๋ฑ์ ์๋ฒ ์์ง์์ ๋์
๐ท ์๋ฒ API
- Spring MVC
- ์๋ธ๋ฆฟ API ์ฌ์ฉ
- Spring WebFlux
- Jetty๋ Undertow ๊ฐ์ ์๋ฒ ์์ง์์ ์ง์ํ๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ์ด๋ํฐ๋ฅผ ํตํด ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ์ง์
๐ท ๋ณด์
- Spring MVC
- Spring Security๊ฐ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํตํฉ
- Spring WebFlux
- Webfilter๋ฅผ ์ด์ฉํด Spring Security ์ฌ์ฉ
๐ท ๋ฐ์ดํฐ ์ก์ธ์ค
- Spring MVC
- Blocking I/O ๋ฐฉ์์ธ Spring Data JDBC, Spring Data JPA, Spring Data MongoDB ๊ฐ์ ๊ธฐ์ ์ฌ์ฉ
- Spring WebFlux
- ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต๊น์ง ์๋ฒฝํ๊ฒ Non-Blocking I/O๋ฅผ ์ง์ํ ์ ์๋๋ก Spring Data R2DBC ๋ฐ Non-Blocking I/O๋ฅผ ์ง์ํ๋ NoSQL ๋ชจ๋ ์ฌ์ฉ
Spring WebFlux์ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ
- ์ต์ด์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Netty ๋ฑ์ ์๋ฒ ์์ง์ ๊ฑฐ์ณ HttpHandler๊ฐ ๋ค์ด์ค๋ ์์ฒญ์ ์ ๋ฌ๋ฐ์. HttpHandler๋ Netty ์ด์ธ์ ๋ค์ํ ์๋ฒ ์์ง์์ ์ง์ํ๋ ์๋ฒ API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์๋ฒ API๋ฅผ ์ถ์ํํด์ฃผ๋ ์ญํ ์ ํจ.
๊ฐ ์๋ฒ ์์ง๋ง๋ค ์ฃผ์ด์ง๋ ServerHttpRequest์ ServerHttpResponse๋ฅผ ํฌํจํ๋ ServerWebExchange๋ฅผ ์์ฑํ ํ, WebFilter ์ฒด์ธ์ผ๋ก ์ ๋ฌํจ. - ServerWebExchange๋ WebFilter ์ฒด์ธ์์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น ํ, WebHandler ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ DispatcherHandler์๊ฒ ์ ๋ฌ๋จ.
- DispatcherHandler์์๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ค๋ Http ์์ฒญ์ ์ ์ ํ Handler๋ก ๋ผ์ฐํ ํ๊ณ , HandlerMapping List๋ฅผ ์๋ณธ Flux์ ์์ค๋ก ์ ๋ฌ๋ฐ์.
- ServerWebExchange๋ฅผ ์ฒ๋ฆฌํ ํธ๋ค๋ฌ๋ฅผ ์กฐํ
- ์กฐํํ ํธ๋ค๋ฌ์ ํธ์ถ์ HandlerAdapter์๊ฒ ์์
- HandlerAdapter๋ ServerWebExchange๋ฅผ ์ฒ๋ฆฌํ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํจ
- Controller ๋๋ HandlerFunction ํํ์ ํธ๋ค๋ฌ์์ ์์ฒญ์ ์ฒ๋ฆฌํ ํ, ์๋ต ๋ฐ์ดํฐ ๋ฆฌํด
- ํธ๋ค๋ฌ๋ก๋ถํฐ ๋ฆฌํด๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ HandlerResultHandler๋ฅผ ์กฐํ
- ์กฐํํ HandlerResultHandler๊ฐ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ํ, response๋ก ๋ฆฌํด
Spring WebFlux์ ํต์ฌ ์ปดํฌ๋ํธ
โณ๏ธ HttpHandler
- ๋ค๋ฅธ ์ ํ์ HTTP ์๋ฒ API๋ก request์ response๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ถ์ํ๋ ๋จ ํ๋์ ๋ฉ์๋๋ง ๊ฐ์ง
public interface HttpHandler {
Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response);
}
public class HttpWebHandlerAdapter extends WebHandlerDecorator implements HttpHandler {
...
...
@Override
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
...
...
ServerWebExchange exchange = createExchange(request, response);
}
}
๐ ServerHttpRequest์ ServerHttpResponse๋ก ServerWebExchange๋ฅผ ์์ฑํ ํ์ WebHandler ํธ์ถ
โณ๏ธ WebFilter
- ํธ๋ค๋ฌ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ์์ ์ ํ ์ ์๋๋ก ํจ
- ์ดํ๋ฆฌ์ผ์ด์
๋ด์ ์ ์๋ ๋ชจ๋ ํธ๋ค๋ฌ์ ๊ณตํต์ผ๋ก ๋์
๐ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์์ฒญ ํธ๋ค๋ฌ์ ํจ์ํ ๊ธฐ๋ฐ์ ์์ฒญ ํธ๋ค๋ฌ์์ ๋ชจ๋ ๋์ ๊ฐ๋ฅ - ์ฃผ๋ก ๋ณด์์ด๋ ์ธ์ ํ์์์ ์ฒ๋ฆฌ ๋ฑ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ณตํต์ผ๋ก ํ์ํ ์ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋จ
public interface WebFilter {
Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain);
}
๐ WebFilterChain์ ํตํด ํํฐ ์ฒด์ธ์ ํ์ฑํ์ฌ ์ํ๋ ๋งํผ์ WebFilter ์ถ๊ฐ ๊ฐ๋ฅ
@Component
public class BookLogFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
String path = exchange.getRequest().getURI().getPath();
return chain.filter(exchange).doAfterTerminate(() -> {
if(path.contains("books")) {
System.out.println("path : " + path + ", status : " +
exchange.getResponse().getStatusCode());
}
});
}
}
๐ doAfterTerminate() operator๋ฅผ ์ด์ฉํด ์ข ๋ฃ ์ด๋ฒคํธ(onComplete, onError) ๋ฐ์ ์, ์์ฒญ URI path์ "books"๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด Book ๋ฆฌ์์ค์ ๋ํ ์์ฒญ์ด๋ผ๊ณ ๊ฐ์ฃผํ๊ณ ๋ก๊ทธ ์ถ๋ ฅ
โณ๏ธ HandlerFilterFunction
@FunctionalInterface
public interface HandlerFilterFunction<T extends ServerResponse, R extends ServerResponse> {
Mono<R> filter(ServerRequest request, HandlerFunction<T> next);
...
...
}
- ํจ์ํ ๊ธฐ๋ฐ์ ์์ฒญ ํธ๋ค๋ฌ์ ์ ์ฉํ ์ ์๋ Filter ๐ WebFilter์ ๋ฌ๋ฆฌ Spring Bean์ผ๋ก ๋ฑ๋ก๋์ง ์์
โณ๏ธ DispatcherHandler
- WebHandler ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ก์, ์ค์์์ ๋จผ์ ์์ฒญ์ ์ ๋ฌ๋ฐ์ ํ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์์ฒญ ์ฒ๋ฆฌ ์์
๐ท DispatcherHandler ์ฝ๋ ์ผ๋ถ
๐นinitStrategies(ApplicationContext context)
- BeanFactoryUtils๋ฅผ ์ด์ฉํด ApplicationContext๋ก๋ถํฐ HandlerMapping Bean, HandlerAdapter Bean, HandlerResultHandler Bean์ ๊ฒ์ํ ํ์ ๊ฐ๊ฐ์ List ๊ฐ์ฒด ์์ฑ
๐น handle(ServerWebExchange exchange)
- List<HandlerMapping>์ Flux.fromIterable() operator์ ์๋ณธ ๋ฐ์ดํฐ ์์ค๋ก ์ ๋ ฅ๋ฐ์ ํ์ getHandler() ๋ฉ์๋๋ฅผ ํตํด ๋งค์น๋๋ Handler ์ค์์ ์ฒซ ๋ฒ์งธ ํธ๋ค๋ฌ ์ฌ์ฉ
- handleRequestWith(ServerWebExchange exchange, Object handler)๋ฅผ ํตํด ํธ๋ค๋ฌ ํธ์ถ ์์
- ์ค์ ํธ๋ค๋ฌ ํธ์ถ์ handleRequestWith() ๋ด๋ถ์์ Handler ๊ฐ์ฒด์ ๋งคํ๋๋ HandlerAdapter๋ฅผ ํตํด์ ์ด๋ฃจ์ด์ง
- handleResult(ServerWebExchange exchange, HandlerResult result)๋ฅผ ํตํด ์๋ต ์ฒ๋ฆฌ ์์
โณ๏ธ HandlerMapping
- request์ handler object์ ๋ํ ๋งคํ์ ์ ์ํ๋ ์ธํฐํ์ด์ค
public interface HandlerMapping {
...
...
Mono<Object> getHandler(ServerWebExchange exchange);
}
โณ๏ธ HandlerAdapter
- HandlerMapping์ ํตํด ์ป์ ํธ๋ค๋ฌ๋ฅผ ์ง์ ์ ์ผ๋ก ํธ์ถ
public interface HandlerAdapter {
boolean supports(Obejct handler);
Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler);
}
Spring WebFlux์ Non-Blocking ํ๋ก์ธ์ค ๊ตฌ์กฐ
- Non-Blocking I/O ๋ฐฉ์์ผ๋ก ์ค๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์์ ๊ณ ์ ๋ ์ค๋ ๋ ํ์ ์ฌ์ฉํด์ ๋ ๋ง์ ์์ฒญ ์ฒ๋ฆฌ
๐ ์์ฒญ ์ฒ๋ฆฌ ๋ฐฉ์ = ์ด๋ฒคํธ ๋ฃจํ ๋ฐฉ์
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ค์ด์ค๋ ์์ฒญ์ ์์ฒญ ํธ๋ค๋ฌ๊ฐ ์ ๋ฌ๋ฐ์
- ์ ๋ฌ๋ฐ์ ์์ฒญ์ ์ด๋ฒคํธ ๋ฃจํ์ ํธ์
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์์ ๋ฑ ๋น์ฉ์ด ๋๋ ์์ ์ ๋ํ ์ฝ๋ฐฑ์ ๋ฑ๋ก
- ์์ ์ด ์๋ฃ๋๋ฉด ์๋ฃ ์ด๋ฒคํธ๋ฅผ ์ด๋ฒคํธ ๋ฃจํ์ ํธ์
- ๋ฑ๋กํ ์ฝ๋ฐฑ์ ํธ์ถํด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ
Spring WebFlux์ ์ค๋ ๋ ๋ชจ๋ธ
โณ๏ธ Reactor Netty์ LoopResource ์ธํฐํ์ด์ค
- Netty์์๋ CPU ์ฝ์ด ๊ฐ์๊ฐ 4๋ณด๋ค ์ ์ ๊ฒฝ์ฐ ์ต์ 4๊ฐ์ ์์ปค ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ , 4๋ณด๋ค ๋ ๋ง๋ค๋ฉด ์ฝ์ด ๊ฐ์๋งํผ์ ์ค๋ ๋๋ฅผ ์์ฑํจ
- ํ์ง๋ง ์๋ฒ ์ธก์์ ๋ณต์กํ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ CPU ์ง์ฝ์ ์ธ ์์
์ ํ๊ฑฐ๋, ํด๋ผ์ด์ธํธ์ ์์ฒญ๋ถํฐ ์๋ต ์ฒ๋ฆฌ ์ ๊ณผ์ ์์ Blocking ๋๋ ์ง์ ์ด ์กด์ฌํ๋ค๋ฉด ์คํ๋ ค ์ฑ๋ฅ์ด ์ ํ๋จ
๐ ์ด๋ฌํ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ณด์ํ๊ณ ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฒ ์์ง์์ ์ ๊ณตํ๋ ์ค๋ ๋ ํ์ด ์๋ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉ
์ฐธ๊ณ ์๋ฃ
'Spring > Spring WebFlux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ Reactive] Operators ไธญ (0) | 2025.01.02 |
---|---|
[๐ Reactive] Operators ไธ (0) | 2024.12.24 |
[๐ Reactive] 6. Sinks์ Scheduler (0) | 2024.12.23 |
[๐ Reactive] 5. Reactor (0) | 2024.12.19 |
[๐ Reactive] 4. Reactive ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์ฌ์ ์ง์ (1) | 2024.12.18 |