Programming/Spring Boot

스프링 프레임워크 Reactive Stack, Servlet Stack 개념

Jan92 2021. 12. 28. 22:01

'스프링 프레임워크(Spring Framework) Reactive Stack과 Servlet Stack'

 

WebClient를 사용하기 위해서 공부하던 중 WebFlux의 개념과 더불어 함께 공부하게 된 부분입니다.

전체적인 Reactive Programming과 함께 공부하며 개념을 잡아가면 더 좋겠지만 당장에 큰 흐름만 파악하기 위해서 정리한 내용이라 틀리거나 부족한 부분이 있을 수 있습니다. 잘못된 부분은 댓글 남겨주시면 다시 공부하여 수정하겠습니다. 미리 감사드립니다.

 

 

 

출처 https://spring.io/reactive

 

Spring Framework5는 Servlet Stack, Reactive Stack이라는 두 가지 웹 스택을 제공합니다.

 

하나는 대부분의 Java 엔터프라이즈 애플리케이션이 사용하는 차단 I/O가 있는 고전적인 'Servlet Stack'입니다. Servlet Stack은 Spring MVC 및 Spring Data로 구성되어 있으며, Tomcat, Jetty, Servlet Container에서 동작합니다.

 

다른 하나는 이벤트 루프, 비차단 실행 모델을 기반으로 하여 더 적은 하드웨어 리소스로 높은 동시성을 처리할 수 있는 'Reactive Stack'입니다. Reactive Stack은 Spring WebFlux와 Spring Data 반응형 저장소(Reactive Repositories)를 활용합니다.

Reactive Stack은 Tomcat, Jetty 외에도 Servlet 3.1+ Container와 Netty, Undertow 같은 논블로킹 서버 위에서 구동됩니다.

 

 

출처 https://www.infoq.com/articles/Servlet-and-Reactive-Stacks-Spring-Framework-5/

 

Servlet Stack에서 Reactive Stack으로의 가장 큰 변화는 Servlet API 3.1에서 도입된 'Non-Blocking I/O'라고 할 수 있습니다.

기존의 Servlet API는 'thread-per-request' 모델을 기반으로 구축되었고, 단일 스레드에서 필터 - 서블릿 체인을 완전히 통과 후 필요에 따라 차단했습니다.

(Spring 3.0의 Async Servlet 기능을 사용하면 필터 - 서블릿 체인을 완전히 통과한 후에도 추가 처리를 위한 응답을 열어둘 수 있습니다.  @Async 어노테이션을 통한 비동기 작업)

 

또한 고전적인 Servlet Stack은 Blocking I/O 작업의 동시 실행을 위해 스레드 풀을 사용했습니다. 이것은 효율적일 수 없는 두 가지 이유를 가지고 있는데요.

첫 번째는 동기화 및 공유 구조 작업을 할 때 응용 프로그램이 올바르게 작동하도록 하기가 어렵다는 것입니다.

두 번째는 모든 차단 작업이 요청의 결과를 기다리기 위해 추가적인 스레드가 필요하다는 점과 원격 클라이언트 및 서비스의 환경에 따라 변경되는(느려지는) 대기시간으로 인해 효율적인 작업이 불가능하다는 것입니다.

 

 

Servlet API 3.1에서 도입된 Non-Blocking I/O 기능은 명령형 차단 의미 체계를 기반으로 구축된 기존 웹 프레임워크에 통합될 수 없기 때문에 Spring MVC에서는 지원하지 않습니다. 대신 Servlet API 3.1과 Netty, Undertow 같은 Non-Blocking 서버 위에 구동되는 'Spring WebFlux'가 새로 만들어졌습니다.

(Spring MVC, Spring WebFlux는 대칭적으로 존재하는 모듈이며 애플리케이션은 하나의 모듈을 사용하거나 경우에 따라 두 가지 모듈을 동시에 사용할 수도 있습니다.)

 

 

 

* Reactive의 정의

'reactive'라는 용어는 변경에 대한 반응에 중점을 두어 만들어진 프로그래밍 모델을 가리킵니다. 네트워크 컴포넌트는 I/O 이벤트에 반응하며, UI 컨트롤러는 마우스 등과 같은 이벤트에 반응합니다. 이러한 맥락에서 Non-Blocking은 Reactive입니다. 이유는 동작을 중단(Blocking)하는 대신 명령의 완료 또는 데이터의 제공 등의 알림에 반응하는 형식을 취하기 때문입니다.

 

 

 

< 함께 보면 좋은 자료 >

 

동기와 비동기, 블로킹과 논블로킹 개념 정리

'동기와 비동기, 블로킹과 논블로킹 - 비슷한 듯하면서도 비슷하지 않은 개념들' 프로그래밍을 하며 자주 접하게 되는 단어들이지만 개념적으로 명확하게 차이를 짚고 넘어간 적이 없었는데 이

wildeveloperetrain.tistory.com

 

< 참고 자료 >

 

[Spring] Web on Reactive Stack 문서(1) - Spring WebFlux

이 문서는 Netty, Undertow, 서블릿 3.1+ 컨테이너와 같은 논 블로킹 서버 위에 구동되는, Reactive Streams(이하 리액티브 스트림) API 기반의 리액티브 스택 웹 애플리케이션 지원에 대해 다룬다. 각 챕터

12bme.tistory.com

 

 

Servlet and Reactive Stacks in Spring Framework 5

Spring Framework 5 supports both traditional servlet-based and reactive web stacks, in the same server application, reflecting a major shift towards asynchronous, non-blocking concurrency in applications. In this article Spring committer Rossen Stoyanchev

www.infoq.com