Spring의 Webflux

최창효·2023년 2월 27일
0
post-thumbnail

Webflux란

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

Reactive변화에 반응하는 것을 중심에 두고 만든 프로그래밍 모델을 의미합니다.
I/O이벤트에 반응하는 네트워크 컴포넌트, 마우스 이벤트에 반응하는 UI컨트롤러 등이 바로 Reactive에 해당합니다.
Reactive는 선언형 프로그래밍의 하나로 데이터의 흐름을 중심으로 프로그래밍을 진행합니다.

Reactive Streamnon-blocking backPressure를 통한 비동기 컴포넌트 간의 상호작용을 정의한 스펙입니다.
Reactive Stream의 주된 목적은 비동기로 데이터를 처리하는 시스템에 어느정도의 data가 들어올지 예측가능하도록 만드는 것입니다. 이러한 목적을 달성하기 위해 backPressure가 중요하게 동작합니다.

  • BackPressure는 producer속도가 consumer의 속도를 넘지 않도록 이벤트 속도를 제어하는 역할을 합니다. 이러한 BackPressure는 Reactive Stream이 시스템 부하에 적절히 대응할 수 있게 만들어 줍니다.

Reactor는 Spring Webflux가 선택한 Reactive Stream Library입니다. (Reactive Streams의 구현체가 Reactor입니다.)
Reactor는 MonoFlux라는 객체로 데이터를 표현합니다. Webflux의 모든 응답은 Mono 또는 Flux에 담아서 반환해야 한다는 의미입니다

  • Mono: 0~1개의 결과를 반환합니다.
  • Flux: 0~N개의 결과를 반환합니다.
Webflux는 클라이언트-서버에서 `reactive` 어플리케이션 개발을 도와주는 스프링 모듈입니다.
-> Webflux는 변화와 반응에 중점을 두는 프로그래밍 개발을 도와주는 스프링 모듈입니다.

Block vs Non-Block

Block은 함수를 호출했을 때 응답이 돌아올 때까지 멈춰있습니다. 그래서 함수가 종료되어야 다음 코드가 실행됩니다.
Non-Block은 함수를 호출했을 때 결과를 받기 위해 멈춰있지 않고 바로 다음 코드를 실행합니다.

Synchronous vs Asynchronous

Synchronous는 호출과 응답이 동시에 이루어집니다. 함수를 호출하면 시간이 얼마나 걸리던지 요청한 자리에서 그 응답을 받아야 합니다. 응답을 받기 전까지 다른 행동을 할 수 없습니다.
Asynchronous는 호출과 응답이 동시에 이루어지지 않습니다. 함수를 호출했을 때 함수에 대한 응답을 언제 받게될지 모릅니다. 응답을 받기 전에 다른 행동을 할 수 있습니다.

(Non)Blocking vs (A)Synchronous

두 그룹은 바라보는 관심사가 다릅니다.
blocking/non-blocking은 호출되는 함수가 바로 return하느냐 그렇지 않느냐가 주된 관심사입니다.

  • 호출된 함수가 자신의 작업을 끝낼때가지 호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 Blocking입니다.
  • 호출된 함수가 곧바로 호출한 함수에게 제어권을 넘겨줘 호출한 함수가 다른 작업을 진행할 수 있다면 Non-Blocking입니다.

Synchronous/Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 주된 관심사입니다.

  • 호출한 함수는 작업 완료 여부를 신경쓰지 않고 호출된 함수가 callback을 통해 작업 완료를 알린다면 Asynchronous입니다.
  • 호출한 함수가 스스로 작업 완료 여부를 확인하거나, 호출되는 함수의 return을 기다린다면 Synchronous입니다.

Spring MVC vs Webflux

Spring MVC는 Blocking, Synchronous방식입니다. 즉, 하나의 요청을 받으면 해당 요청에 대한 return을 반환하기 전까지 다른 작업을 진행할 수 없습니다. Spring MVC는 사용자 요청이 들어올때마다 쓰레드를 생성해서 처리합니다. 한 명의 요청은 하나의 쓰레드가 담당하게 되고, 해당 쓰레드는 다른 작업을 호출하게되면 해당 결과를 반환받기 전까지 아무런 작업도 할 수 없습니다.

Webflux는 Non-Blocking, Asynchronous방식입니다. 요청이 발생하면 이에 맞는 핸들러에게 처리를 위임합니다. 처리가 완료되면 이벤트 루프를 활용한 callback 메서드를 던져주기 때문에 대기시간 없이 비동기적으로 요청을 처리할 수 있습니다.

  • 이벤트 루프는 요청 핸들러의 요청 이벤트를 받아 콜백을 등록합니다. 이벤트 루프는 해당 작업이 끝났다는 이벤트를 받으면 콜백을 호출해 요청 핸들러에게 알려줍니다.

Event-Driven

프로그램 실행 흐름이 이벤트에 의해 결정되는 프로그래밍 패러다임입니다. Event가 발생할 때 이를 감지하고 적합한 이벤트 핸들러를 사용해 이벤트를 처리하도록 설계하는 방법으로 Webflux의 Event-loop가 이러한 방식으로 동작합니다.

결론

Webflux는 변화와 반응에 중점을 두는 프로그래밍 개발을 도와주는 스프링 모듈입니다.
Spring MVC를 대체하기 위해 등장했으며 이벤트 루프를 활용해 동작하며 호출된 함수에게 제어권을 바로 넘겨받으며(Non-Blocking), callback을 통해 작업의 완료를 전달받는(Asynchronous) 방법을 이용해 자원의 낭비를 줄이고 효율적으로 동시성을 다루기 위한 프레임워크입니다.

References

profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글