Webflux는 클라이언트-서버에서 reactive
어플리케이션 개발을 도와주는 스프링 모듈입니다.
Webflux는 Servlet API기반의 Spring WebMVC를 대체하기 위한 프레임워크이며 non-blocking Reactive Stream
을 지원합니다.
Webflux는 적은 양의 스레드 및 하드웨어 리소스로 동시성을 핸들링
하기 위해 탄생했으며, Webflux의 기반으로 함수형 프로그래밍
이 자리잡고 있습니다.
간단히 말하면 Webflux는 Blocking
, Synchronous
인 Spring MVC를 대체하기 위해 만들어진 Event-driven
, non-blocking
, Asynchronouns
방식의 웹 프레임워크 입니다.
지금부터 위 설명에 나온 복잡한 용어들을 하나씩 살펴보면서 Webflux를 이해해 보도록 하겠습니다.
Reactive
란 변화에 반응하는 것을 중심에 두고 만든 프로그래밍 모델
을 의미합니다.
I/O이벤트에 반응하는 네트워크 컴포넌트, 마우스 이벤트에 반응하는 UI컨트롤러 등이 바로 Reactive에 해당합니다.
Reactive는 선언형 프로그래밍의 하나로 데이터의 흐름
을 중심으로 프로그래밍을 진행합니다.
Reactive Stream
은 non-blocking backPressure
를 통한 비동기 컴포넌트 간의 상호작용을 정의한 스펙
입니다.
Reactive Stream의 주된 목적은 비동기로 데이터를 처리하는 시스템에 어느정도의 data가 들어올지 예측가능하도록 만드는 것입니다. 이러한 목적을 달성하기 위해 backPressure가 중요하게 동작합니다.
BackPressure
는 producer속도가 consumer의 속도를 넘지 않도록 이벤트 속도를 제어하는 역할을 합니다. 이러한 BackPressure는 Reactive Stream이 시스템 부하에 적절히 대응할 수 있게 만들어 줍니다.Reactor
는 Spring Webflux가 선택한 Reactive Stream Library
입니다. (Reactive Streams의 구현체가 Reactor입니다.)
Reactor는 Mono
와 Flux
라는 객체로 데이터를 표현합니다. Webflux의 모든 응답은 Mono
또는 Flux
에 담아서 반환해야 한다는 의미입니다
Webflux는 클라이언트-서버에서 `reactive` 어플리케이션 개발을 도와주는 스프링 모듈입니다.
-> Webflux는 변화와 반응에 중점을 두는 프로그래밍 개발을 도와주는 스프링 모듈입니다.
Block
은 함수를 호출했을 때 응답이 돌아올 때까지 멈춰있습니다. 그래서 함수가 종료되어야 다음 코드가 실행됩니다.
Non-Block
은 함수를 호출했을 때 결과를 받기 위해 멈춰있지 않고 바로 다음 코드를 실행합니다.
Synchronous
는 호출과 응답이 동시에 이루어집니다. 함수를 호출하면 시간이 얼마나 걸리던지 요청한 자리에서 그 응답을 받아야 합니다. 응답을 받기 전까지 다른 행동을 할 수 없습니다.
Asynchronous
는 호출과 응답이 동시에 이루어지지 않습니다. 함수를 호출했을 때 함수에 대한 응답을 언제 받게될지 모릅니다. 응답을 받기 전에 다른 행동을 할 수 있습니다.
두 그룹은 바라보는 관심사
가 다릅니다.
blocking/non-blocking
은 호출되는 함수가 바로 return하느냐 그렇지 않느냐
가 주된 관심사입니다.
Synchronous/Asynchronous
는 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐
가 주된 관심사입니다.
Spring MVC는 Blocking, Synchronous방식입니다. 즉, 하나의 요청을 받으면 해당 요청에 대한 return을 반환하기 전까지 다른 작업을 진행할 수 없습니다. Spring MVC는 사용자 요청이 들어올때마다 쓰레드를 생성해서 처리합니다. 한 명의 요청은 하나의 쓰레드가 담당하게 되고, 해당 쓰레드는 다른 작업을 호출하게되면 해당 결과를 반환받기 전까지 아무런 작업도 할 수 없습니다.
Webflux는 Non-Blocking, Asynchronous방식입니다. 요청이 발생하면 이에 맞는 핸들러에게 처리를 위임합니다. 처리가 완료되면 이벤트 루프
를 활용한 callback 메서드를 던져주기 때문에 대기시간 없이 비동기적으로 요청을 처리할 수 있습니다.
프로그램 실행 흐름이 이벤트에 의해 결정되는 프로그래밍 패러다임입니다. Event가 발생할 때 이를 감지하고 적합한 이벤트 핸들러를 사용해 이벤트를 처리하도록 설계하는 방법으로 Webflux의 Event-loop가 이러한 방식으로 동작합니다.
Webflux는 변화와 반응에 중점을 두는 프로그래밍 개발을 도와주는 스프링 모듈입니다.
Spring MVC를 대체하기 위해 등장했으며 이벤트 루프를 활용해 동작하며 호출된 함수에게 제어권을 바로 넘겨받으며(Non-Blocking), callback을 통해 작업의 완료를 전달받는(Asynchronous) 방법을 이용해 자원의 낭비를 줄이고 효율적으로 동시성을 다루기 위한 프레임워크입니다.