[개발일지] 230629 Spring WebFlux란? (with. Reactive programming)

오늘은 기존에 작성되어 있던 코드에서 별도의 프로젝트 모듈을 만들어서 분리하는 작업을 했다. 프로젝트 세팅하고 코드만 옮기면(ctrl c + ctrl v만 하면 되는 줄..) 되는 간단한 문제인 줄 알았는데 생각보다 변경되어야 할 점이 많아 시간을 많이 잡아먹었다..

 

우선 기존 프로젝트는 Quarkus라는 프레임워크를 이용해 AppSync를 통해 실시간 데이터를 전송하고 있던 프로젝트였는데 분리해서 만들어야하는 프로젝트는 Quarkus 프레임워크가 아닌 Spring 프레임워크를 이용해서 새로운 프로젝트를 세팅해야 했다.

 

Spring 프로젝트를 만들어서 코드를 옮기는데 Quarkus에만 존재하는 어노테이션들이나 기능들이 있어서 Spring으로 마이그레이션하는데 찾느라 시간을 많이 잡아먹었던 것이었다.

 

그중 Quarkus에서는 graphql 쿼리를 날릴 때 RestClient를 사용해 비동기 처리를 하고 있었는데 spring으로는 비동기 처리하려면 WebClient를 사용해야 한다는 걸 알게 되었고 이 부분을 학습하는데 시간을 사용했다. 

 

그래서 오늘은 WebClient와 WebFlux에 대해 학습한 걸 공유하고자 한다.

 

WebFlux


우선 Spring의 WebFlux는 Spring Framework 5에서 소개된 리액티브 웹 프레임워크이다.

WebFlux는 비동기 Non-Blocking 방식의 처리로, 기존의 서블릿 기반의 Spring MVC와는 달라서 대량의 동시 요청 처리와 같은 고부하 환경에서 특히 유용하다고 한다. (동시에 수천, 수만 개의 연결을 처리하는 데에 특히 효과적)

 

리액티브 프로그래밍은 데이터 흐름과 전달에 대한 변경 사항이 자동으로 전파되는 프로그래밍 패러다임으로 이를 통해서 애플리케이션은 더욱 빠르게 응답할 수 있고, 자원을 더욱 효과적으로 관리할 수 있다.

 

여기서 잠깐 리액티브 프로그래밍에 대해 알아보자.

 

Reactive programming이란?


리액티브 프로그래밍은 데이터의 변화가 발생할 때까지 기다리는 것이 아니라, 데이터의 변화가 있을 때마다 즉시 반응하여 처리하는 프로그래밍 패러다임이다. 데이터의 변경 사항을 자동으로 전달한다.

 

이해하기 쉽게 간단한 예시를 들어보자.

마트에서 물건을 판매할 때를 떠올려보자.

손님이 어떤 물건을 사려고 할 때마다 매번 주인에게 물어보면 번거롭고 서로  불편할 것이다. 이를 위해서 마트에서는 물건에 해당 물건의 가격표를 붙여놓는데, 여기서 가격표는 데이터(물건의 가격)를 나타내고, 손님은 이 가격표를 보고 물건의 가격을 바로 알 수 있다.
만약에 물건의 가격이 변동이 된다면 마트 주인은 가격표를 수정할 테고, 이 수정(변화)은 손님이 바로 보고 인지할 수 있다. 

이렇게 데이터의 변화가 발생하면 그 변화를 바로 알 수 있도록 하는 것이 바로 리액티브 프로그래밍의 개념이다.

 

위의 예시처럼 리액티브 프로그래밍은 능동적으로 변화를 탐지하고, 변화에 따라 동작을 수행하여 애플리케이션의 반응성을 향상시킨다.

특히 대량의 데이터 처리나 고부하의 상황에서 유용하다.

 

WebFlux 사용해야 하는 경우


그럼 WebFlux는 언제 사용해야 하는가? 

위에서도 많이 언급했지만 동시에 많은 요청을 효율적으로 처리할 수 있기 때문에 대용량 트래픽이 몰리는 웹 서비스나, 데이터의 실시간성이 중요한 애플리케이션은 WebFlux 사용을 고려해 볼 만하다.

 

현재 WebFlux를 공부하고 있는 이유도 회사에서 데이터의 실시간성이 중요했기 때문에 데이터를 비동기적으로 처리해야 했기 때문이다.

 

  1. 대용량 트래픽: 대규모 웹 서비스나 플랫폼에서는 동시에 수 천, 수 만, 수십만 개의 연결이 이루어질 수 있습니다. 이러한 고부하 상황에서는 전통적인 방식보다 리액티브 프로그래밍 모델이 더욱 효율적일 수 있습니다.
  2. 비동기 데이터 스트림 처리: 웹소켓, SSE 같은 기술을 활용한 실시간 애플리케이션에서는 데이터 스트림을 비동기적으로 처리해야 할 필요가 있기 때문에 WebFlux가 효과적이다.

 

Spring Web MVC  VS  Spring Web Flux


Spring Web MVC와 Spring Web Flux의 주요 차이점은 Blocking과 Non-Blocking에 있다.

 

Spring Web MVC: Servlet API와 Servlet container를 기반으로 하는 Blocking I/O를 사용하는 웹 애플리케이션을 개발할 때 사용되는 프레임워크이다.

이는 각 HTTP 요청이 별도의 스레드에서 처리되기 때문에 요청이 처리되는 동안 I/O 작업이 발생하면 해당 스레드가 blocking 되고, 해당 스레드는 블로킹이 해제될 때까지 멈춰 있는다. 그래서 고부하 상황에서는 스레드의 비효율적인 사용이 발생할 수 있다.

 

Spring Web Flux: Spring WebFlux는 비동기와 Non-Blocking을 기반으로 하는 리액티브 웹 프레임워크이다. 

 

한 스레드가 여러 요청을 처리할 수 있다는 특징이 있어 I/O 작업이 발생하면 작업을 Non-blocking 방식으로 스케줄링하고, 해당 스레드를 다른 작업에 즉시 재사용할 수 있게 함으로써 가능하다.

즉 동시에 많은 수의 요청을 Web Mvc보다 더 효율적으로 처리할 수 있다.

 

 

WebClient는 다음 포스팅에서 계속..

 

References

https://docs.spring.io/spring-framework/reference/web/webflux.html

 

Spring WebFlux :: Spring Framework

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports

docs.spring.io