Spring WebFlux
목차
- WebFlux 개념
- WebFlux 도입 배경
- WebFlux 특성(reative, non-blocking, async)
- Spring MVC와 WebFlux 차이
- WebFlux 구조/원리
- WebFlux 적용 예제
개요
면접 질문에 WebFlux에 관한 기술 질문들이 많이 나왔었다.
실제 실무에서 사용해보지 못한 기술이였기 때문에, 실제 면접 본 회사에서 적용하려고 하는 것 같다.
WebFlux에 대해서 공부를 하며 적용해보려고 한다.
상세
1. WebFlux 개념
Spring WebFlux는 Spring FrameWork 5에서 새로 추가된 모듈이다.
WebFlux는 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이다.
WebFlux는 reactive-stack web framework이며 non-blocking에 reactive stream을 지원합니다.
WebFlux에 대해 이해를 하려면 reactive, non-blocking, async에 대해 이해를 하여야 한다.
이 부분은 밑에서 다루도록 하겠다.
2. WebFlux 도입 배경
WebFlux를 만든 이유는 무엇인가?
- 적은 수의 쓰레드로 동시성을 처리하고 non-blocking/async 방식으로 자원을 효율적으로 사용
- 함수형 프로그래밍. 함수형 AP를 위한 Lamda표현식 추가(non-blocking API 토대)
3. WebFlux 특성(reative, non-blocking, async)
reactive 정의
Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blocking back pressure.
논블로킹(Non-blocking) 백 프레셔(back pressure)를 이용한 비동기 데이터 처리의 표준
‘reactive’라는 용어는 I/O 이벤트에 반응하는 네트워크 컴포넌트, 마우스 이벤트에 반응하는 UI 컨트롤러 등과 같은 변화에 대한 반응을 중심으로 구축된 프로그래밍 모델을 나타낸다.
따라서 non-blocking은 blocking과 다르게 작업이 완료되거나 데이터를 사용가능한 상태가 되면 알림에 반응하는 방식이 있으므로 reactive하다고 말 할 수 있다.
non-blocking(논-블럭킹) vs blocking(블록킹) 차이
- 제어권 반환
- 제어할 수 없는 대상의 처리 방법
- 블록킹(blocking)
- 특정 작업이 실행되는 동안, 끝날때까지 제어권을 가지고 있어 다른 작업은 진행하지 못하고 대기해야만 하는 방식
- 논블록킹(non-blocking)
- 특정 작업이 실행되는 중이라도, 바로 리턴 해서 제어권을 주어 상관없이 다른 작업을 수행 가능한 방식
async(비동기) vs sync(동기) 차이
- 시간
- 동기(Synchronous)
- 호출하고 호출된 작업이 완료 된 후의 리턴을 기다리거나, 호출된 함수가 계속해서 작업완료 여부를 신경 씀 비동기(Asynchronous)
- 함수를 호출할 때 callback 함수를 같이 전달해 작업이 완료되면 callback을 실행 작업완료를 callback함수가 신경 씀
Spring MVC는 Blocking + Sync 방식.
Spring WebFlux는 Non-Blocking + Async 방식.
Spring MVC vs WebFlux 흐름
Spring MVC vs WebFlux 구조
WebFlux 적용 방식 2가지
- 어노테이션 방식
- 함수형 방식
Spring boot에서 WebFlux 이용하려면 아래 denpendency를 추가하여야합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
…..추가 예정 …….
정리
참고
https://docs.spring.io/spring-framework/docs/5.0.0.M5/spring-framework-reference/html/web-reactive.html https://www.baeldung.com/spring-webflux
https://engineering.linecorp.com/ko/blog/reactive-streams-with-armeria-1/
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux