JVM/Spring

[Spring] 스프링 5.0 WebFlux 에 대해

헹창 2022. 5. 11.
반응형

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
반응형

댓글

추천 글