Spring WebFlux
Spring Framework, Spring Web MVC를 포함하는 기존의 웹 프레임워크는 Servlet API와 Servlet containers를 통해 만들어졌었다. Spring WebFlux는 reactive-stack web framework다. 스프링 5.0버전에 추가된 개념으로, non-blocking과 Reactive Streams를 완전히 지원한다.
내장서버는 기본적으로 Tomcat이 아닌 Netty 서버를 사용한다. (톰캣으로 사용할 수는 있다)
Spring Web MVC와 Spring Web Flux는 동시에 사용할 수 있다. 두 가지를 동시에 사용하게 되면 MVC가 기본으로 적용되고 Spring MVC controller에 reactive WebClient를 함께 사용할 수 있게 된다.
등장 배경
MSA가 널리 사용됨에 따라 이벤트 루프를 사용하는 비동기 프로그래밍의 중요성이 커졌다.
동기식 호출 방식에서 스레드는 응답이 올 때 까지 기다린다. 만약 어떠한 이유로 요청이 늦어지거나 타임아웃이 발생한다면 MSA환경에서는 시스템에 심각한 악영향으로 이어질 수 있다.
비동기 방식은 스레드가 요청을 보낸 뒤 응답이 올 때까지 마냥 기다리는 것이 아니라 기다리는 동안 다른 일을 처리할 수가 있다. 불필요하게 리소스를 점유하는 일이 없어지는 것이다.
MSA방식이 널리 사용되면서 스프링에서 내놓은 대안이 바로 Spring WebFlux이다.
Reactive API
WebFlux방식은 이전의 MVC방식과 사용방법이 매우 유사하다. 특히 애노테이션 방식은 거의 다른점이 느껴지지 않을 정도다.
가장 다른 점이라고 할 수 있는 Reactive API는 Spring WebFlux에서 선택한 reactive라이브러리인 Reactor
를 기반으로 한다.
Reactive API는 Mono
와 Flux
API타입을 제공한다.
Mono
: 0~1개의 아이템을 가지고 있는 publisherFlux
: 0~N개의 아이템을 가지고 있는 publisher
Reactive
반응을 중심으로 구축된 프로그래밍 모델
WebFlux와 MVC의 차이?
WebFlux와 MVC는 사용방법이 매우 유사하고, 동시에 사용할 수도 있다.
WebFlux는 non-blocking이다. 이 점이 가장 큰 차이점이다. MVC는 기본적으로 동기식이고, blocking이다.
WebFlux는 반드시 Publisher Object
로 감싸서 반환해야 한다.
사용방법
Spring WebFlux는 두 가지 프로그래밍 모델을 제공한다.
Annotated Controllers
: MVC, spring-web과 거의 동일하다. 애노테이션(@Contorller
,@GetMapping
과 같은)도 동일하게 사용한다. -> 진입장벽이 낮은 방식Functional Endpoints
: Lambda 기반의 경량 함수형 프로그래밍 모델이다. 핸들러를 따로 작성하는 방식이다.