WebFlux 란?
WebFlux는 확장 가능하고 효율적인 reactive 스타일의 웹 애플리케이션을 구축하기 위해서 Spring Framework 5 에서 새롭게 추가된 모듈로, Reactor 라이브러리를 사용하여 reactive programming을 지원하도록 설계되었다.
WebFlux 의 등장 배경
기존의 Monolithic Architecture 환경에서는 Thread Pool을 사용해 동기식 프로그래밍의 blocking을 감당할 수 있었고, 단일 애플리케이션 내부에서 정보 교환이 일어나기 때문에 blocking 되는 시간이 길지 않았다. 이러한 Monolithic Architecture 에서 하나의 큰 서비스가 작은 단위의 독립된 모듈로 쪼개지는 MSA Architecture 방식으로 바뀌면서, 단일 애플리케이션 내부에서 일어나던 정보교환이 네트워크를 통한 모듈과 모듈 간의 정보 교환으로 바뀌게 되었다. 이로 인해 다음과 같은 문제가 발생했다.
- blocking 시간이 길어질 경우 응답을 기다리는데 Thread를 모두 소진해 버릴 수 있다.
- Timeout 이 발생할 정도의 지연이 발생하면 다른 모듈에도 영향을 주어 전체 시스템이 다운될 수 있다.
이러한 문제점들을 극복하기 위해 MSA 환경에 들어서면서 Event Loop를 이용한 비동기 프로그래밍이 부각되기 시작했고 Spring 생태계에서도 WebFlux를 통해 비동기 프로그래밍을 본격적으로 도입하게 되었다.
Reactive Programing(반응형 프로그래밍)?
reactive programming(반응형 프로그래밍) 은 Event Loop 와 SSE(Server Send Event) 를 통해 비동기 데이터 스트림과 non-blocking I/O 작업의 사용을 강조하는 패러다임이다. reactive programming 은 비동기 데이터 스트림과 non-blocking I/O 작업을 사용하여 최소한의 리소스를 사용하여 많은 동시 요청을 처리할 수 있게 해 준다. 이러한 점은 blocking I/O를 사용하는 기존 프레임워크보다 더 나은 성능과 확장성을 제공한다.
Spring MVC 와의 차이점?
Programming Model
Spring Webflux는 반응형 프로그래밍 모델을 기반으로 하지만 Spring MVC는 전통적인 request-response 프로그래밍 모델을 사용한다. 반응형 프로그래밍은 non-blocking, event-driven 기반 요청 처리를 하는 반면, request-response 프로그래밍은 다음 요청으로 넘어가기 전에 이전의 요청에 대한 응답이 완료될 때까지 기다린다.
Thread Management
Spring Webflux는 적은 수의 Thread를 사용하여 들어오는 요청을 처리하기 때문에 시스템 리소스를 보다 효율적으로 사용할 수 있다. 반면 Spring MVC는 요청당 Thread를 생성하여 처리하기 때문에 다수의 사용자의 요청이 들어오면 많은 리소스를 사용하게 된다. 이를 방지하기 위해서 Spring MVC에서는 Thread Pool을 만들어두어 미리 만들어둔 Thread를 하나씩 가져와서 사용하게 된다. 하지만 이 방식 또한 더 많은 사용자가 동시 요청을 보낼 시 Pool Size를 초과해서 Queue에 요청이 계속 쌓이게 되는 Thread Pool Hell 현상이 발생할 수 있다. 그러므로 Spring MVC에서는 해당 시스템의 트래픽을 고려하여 Thread Pool size를 적절히 조정하는 것이 중요하다.
Database
Spring Webflux는 Spring Data R2DBC(Reactive Relational Database Connectivity)라는 Spring Data의 반응형 버전을 사용한다. R2DBC는 관계형 DB에서 효율적으로 코드가 동작할 수 있도록 reactive programming API를 가능하게 해 준다. 즉, DB에 non-blocking 접근을 가능하게 해 준다. 기존 관계형 DB 접근 API는 blocking API 이기 때문에, 완전한 non-blocking 서비스를 구축할 수 없었다.
끝으로
WebFlux에 대해 간단히 알아보았습니다. 그렇다면 무조건 Spring MVC 보다 WebFlux를 사용하는 것이 좋을까? 그렇지 않습니다. WebFlux 의 비즈니스 로직들이 모두 Async, Non-Blocking 으로 되어있다면 충분히 빠를 수 있습니다. 하지만 이러한 코드를 짜는 것은 어려운 일이고 Spring MVC가 트래픽을 감당할 수 없는 서비스가 아닌 이상 굳이 WebFlux를 도입할 필요는 없다고 생각합니다.
다음 포스팅에서는 Webflux 에서 사용하는 Reactive Streams API의 구성요소와 동작 구조에 대해 알아보겠습니다.
참고
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
https://pearlluck.tistory.com/712
https://velog.io/@dyllis/Spring-MVC-vs-WebFlux
https://pangtrue.tistory.com/191
'Spring > WebFlux' 카테고리의 다른 글
Reactive Streams 에 대해 알아보자! (0) | 2023.03.26 |
---|