'스프링 프레임워크(Spring Framework) Reactive Stack과 Servlet Stack'
WebClient를 사용하기 위해서 공부하던 중 WebFlux의 개념과 더불어 함께 공부하게 된 부분입니다.
전체적인 Reactive Programming과 함께 공부하며 개념을 잡아가면 더 좋겠지만 당장에 큰 흐름만 파악하기 위해서 정리한 내용이라 틀리거나 부족한 부분이 있을 수 있습니다. 잘못된 부분은 댓글 남겨주시면 다시 공부하여 수정하겠습니다. 미리 감사드립니다.
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 같은 논블로킹 서버 위에서 구동됩니다.
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)하는 대신 명령의 완료 또는 데이터의 제공 등의 알림에 반응하는 형식을 취하기 때문입니다.
< 함께 보면 좋은 자료 >
< 참고 자료 >
'Programming > Spring Boot' 카테고리의 다른 글
Spring Cache 캐시 추상화 기본적인 사용법 @Cacheable @CachePut @CacheEvict (0) | 2022.01.18 |
---|---|
Spring Boot 예외 처리 @ControllerAdvice, @ExceptionHandler (0) | 2021.12.30 |
RestTemplate Logging 요청과 응답 로그 남기기 (0) | 2021.12.23 |
Spring Boot Google OTP 2단계 보안인증 (Authenticator) 개념과 간단한 코드 (0) | 2021.12.20 |
Querydsl DTO 조회하는 방법(Projection, @QueryProjection) (0) | 2021.12.10 |