1. WebFlux란?
1.1 WebFlux 가 생긴 이유
- 기존 스프링 프레임워크는 Servlet API와 Servlet 컨테이너로 이루어졌고, 동기적으로 요청을 처리함.
기존 Spring MVC는 하나의 요청에 대해 하나의 스레드
가 사용된다- thread:request(1:1), sync + blocking 방식
- 스레드 생성에는 시간이 걸리기 때문에, 다수의 요청을 고려하여 미리 스레드 풀을 생성해놓는다.
- 또한, 스레드는 컨텍스트 스위칭 비용이 발생한다.
- 기존에는 하나의 요청마다 하나의 스레드를 할당하여 처리했다.
- MSA 환경에서 한 서비스가 다수의 다른 서비스들에게 요청하고 결과를 기다릴 때 까지 스레드를 점유하면, 스레드가 계속해서 사용되고 있는 상황이 유지된다. 따라서, 다수의 유저에게 응답해줄 수 없다.
- 이러한 문제로 인하여 적은 양의 스레드와 최소한의 하드웨어 자원으로 동시성을 핸들링하기 위해 만들어졌다.
- 단일 스레드에서 Blocking I/O 와 Non-Blocking I/O 를 비교하면 아래와 같습니다.
1.2. WebFlux 특징
- WebFlux 는 이를
리액티브 프로그래밍 방식을 사용
하여논블로킹과 고정된 스레드로 모든 요청을 처리
하여 기존의 문제를 해결한다.- thread:many_request(1:N), async + nonblocking 방식
- Spring Framwork5에서 새롭게 추가된 모듈이며 reactive 스타일의 어플리케이션 개발을 도와준다
- reactive 란?
- reactive란 반응형 프로그래밍으로 변화에 반응하게 만들어진 프로그래밍 모델
- 반응형 프로그래밍은 데이터 스트림을 처리하며 이 데이터 스트림이 변경될 때마다 반응
- 기존에 사용하던 명령형 프로그래밍의 경우는 컴퓨터가 수행해야 하는 일을 순서대로 처리
- reactive 란?
- WebFlux 는
반응형 프로그래밍(Reactive Programming)
방식을 통해Event-Driven(이벤트 기반)의 비동기식 애플리케이션
을 구축 - reactive-stack web framework이며 non-blocking에 Reactive stream 지원
- 반응형 스트림(Reactive Stream)에서 Publisher-Subscriber 패턴을 사용
- Publisher는 데이터를 생성하고 Subscriber는 이를 처리
- 이벤트 스트림에 있는 데이터를 Subscriber가 비동기적으로 가져옴
- tomcat이 아닌 netty 같은 async, non-blocking 서버 사용
- webflux Non-Blocking Request을 수행 중에 결과가 반환되지 않더라도 다른 작업 수행 가능
- 동기 프로그래밍과 비교하여 디버깅이 어려움
- 비동기 소스코드 안에 동기 코드가 있으면, 비동기로 동작하지 않을 수 있어 주의 필요
- 서비스간 호출이 많은 마이크로서비스 아키텍처에 적합
reference
- https://heeyeah.github.io/spring/2020-02-29-web-flux/
- https://adjh54.tistory.com/232
- https://devmoony.tistory.com/174
- https://techblog.woowahan.com/2667/
PREVIOUS환경 세팅과 첫 프로젝트 생성하기