반응형
WebFlux 개요
Spring 5에서 도입된 reactive-stack web framework
- asynchronous (비동기) - non-blocking(논블로킹) reactive 개발에 사용
- reactive streams 의 back pressure 지원
- non-blocking server에서의 실행 지원 (Netty, Undertow, and Servlet 3.1 + containers)
- Tomcat, Jetty 와도 실행 가능
스레드나 CPU 자원을 낭비하지 않고, 많은 요청을 처리할 수 있는 고성능 웹 애플리케이션 개발 목적
Spring 5.0 의 WebFlux 주요 특징 ?
- 함수형 프로그래밍
- 최소 Java 8 + 버전 사용, Java 8에 람다 함수 표현이 추가되어 함수형 프로그래밍 가능 - Servlet 의존성 제거
- 기존 Spring 웹 개발 베이스로 삼았던 서블릿 기술과 API를 버림
- 서블릿 호환 API인 HttpServletRequest, HttpServletResponse 를 사용하지 않고, 대신 이를 추상화한 새로운 모델인 ServerRequest, ServerResponse 사용
Spring-webmvc vs Spring-webflux
1. 개발 방식 비교 (code example)
일반적인 웹 요청 처리 방식
- 요청 매핑
- 요청 바인딩
- 핸들러 실행
- 핸들러 결과 처리(응답 생성)
spring-webmvc
@RestController
public class MyController {
@GetMapping("/hello/{name}") /*1. 요청매핑*/
String hello(@PathVariable String name /*2. 요청바인딩*/) { /*3. 핸들러 실행*/
return "Hello" + name; /*4. 핸들러 결과처리 (응답생성) */
}
}
spring-webflux
// FunctionalInterface : RouterFunction 인터페이스에 정의되어있는 인터페이스
@FunctionalInterface
public interface RouterFunction<T extends ServerResponse> { // ServerResponse : WebFlux의 웹 응답을 담당
Mono<HandlerFunction<T>> route(ServerRequest request); // ServerRequest : WebFlux의 웹 요청을 대표하는 API
}
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {
Mono<T> handle(ServerRequest request);
}
이를 람다식으로 더욱 간결하게 다음과 같이 구현할 수 있다.
HandlerFunction helloHandler = req -> ok().body(fromObject("Hello" + req.PathVariable("name")));
RouterFunction router = req ->
RequestPredicates.path("/hello/{name}").test(req) ? // 웹 요청 정보 중 URL 경로 패턴 검사
Mono.just(helloHandler) : Mono.empty(); // 조건에 맞으면 핸들러 함수를 Mono에 담아서 반환
여기서, RouterFunctions.route(predicate, handler) 라는 것을 이용하여 더 간결하게 만들 수 있다고 한다.
RouterFunction router =
RouterFunctions.route(RequestPredicates.path("/hello/{name}"), req ->
ServerResponse.ok().body(frmObject("Hello" + req.PathVariable("name"))));
// 첫 번째 파라미터 : RouterFunction의 매핑 조건을 체크하는 로직만 발췌
// 두 번째 파라미터 : HandlerFunction 그대로
2. 성능 비교
Non blocking IO 기반 Spring WebFlux 와 blocking IO 기반 Spring WebMVC의 구조와 성능 비교
동시 접속자 수 | Web MVC (max pool size = 200) | WebFlux |
100 | 363 | 374 |
200 | 583 | 568 |
500 | 1,299 | 876 |
1,000 | 1,987 | 1,399 |
5,000 | 4,867 | 2,980 |
10,000 | 9,018 | 4,140 |
실무에 사용하기 전 webflux라는 spring 모듈에 관해 이론적으로 공부를 하게되어, 선행 학습이 필요한 reactive programming, reactor (lib), rxJava 등에 대한 기초지식 없이 정리를 하게 되었다.
테스트 프로젝트를 작성하고, 실무에 투입되어 경험을 쌓게되면 더 정확하고 자세한 내용을 공유할 예정이다.
728x90
반응형
댓글