[ WebFlux 간단 소개 ]
- Spring의 reactive-stack web framework
- Srpring5에서 새롭게 추가된 모듈
(기존의 Spring MVC 모듈과 자주 비교된다)
[ WebFlux 이해 준비 ]
- webflux는 기존에 많이 사용하던 SpringMVC 와 필요한 개념들이 많이 다르다
- 그래서, 막상 공부하려면 reactive programming, reactor 등 많은 새로운 개념들을 공부하게 된다
- 중요한 것은 우선 관련 키워드의 개념과 키워드간 연관관계를 알고가는 것이라고 생각한다
[ WebFlux와 관계 ]
- Webflux는 결국 Reactive Programming을 목적으로 하는 도구이다
[ 개념 ]
- 작성한 코드의 순서대로 진행되는 기존의 명령형 프로그램과 다르게 데이터의 흐름을 먼저 정의하고, 데이터의 변화 혹은 작업의 종료에 따라 반응하여 진행되는 프로그래밍
- 실시간 변화(이벤트 등)에 반응하는 것을 중점으로 둔 프로그래밍 모델
[ 특징 ]
- 비동기 이벤트 처리를 위해 Observer패턴을 기반으로 동작
- 비동기적인 데이터의 Stream으로 간주하고, Observer 패턴을 활용해서 비동기 이벤트를 처리
- 함수형 프로그래밍의 지원을 통해서 스레드 안정성을 보장 받는다
=> 데드락, 동기화 문제에서 벗어날 수 있다
[ 정의 ]
- non-blocking / backpressure을 이용하여 비동기 서비스를 할 때 표준이 되는 스펙
[ 목적 ]
- Reactive Programming을 구현
- 비동기의 경계를 명확히 하여 스트림 데이터의 교환을 효과적으로 관리
- BackPressure를 통해서 컴포넌트 간 데이터를 비동기적으로 전달
(Subscriber의 장애를 방지하는 매커니즘)
[ 구현체 ]
- RxJava
- Project Reactor
(WebFlux에서 사용중인 reactive 라이브러리)
[ API 구성 요소 ]
- Publisher
- 생산자
- 시그널 :
subscribe()
- Subscriber
- 구독자
- 시그널 :
onSubscribe()
/onNext()
/onError()
/onComplete()
- Subscription
- publisher와 subscriber 사이에서 중계하는 역할 (데이터 요청량 조절, 구독 취소)
- 시그널 :
request()
/cancel()
- Preocessor
- Publisher와 Subscriber를 혼합한 형태
=> ex) subscriber의 결과를 다른 subsriber에게 전달 -> 마치 새로운 Publisher처럼 동작
=> ex) 구독자 중 기준에 일치하는 구독자들에게만 전송 / 멀티캐스팅
[ 전체 흐름 ]
- 동작 순서
- Subscriber가
subscribe()
메서드를 통해 Publisher에게 구독 요청- Publisher는
onSubscribe()
메서드로 Subscription을 Subscriber에게 전달- Subscriber는
Subscription.request()
를 통해, 자신에게 데이터를 흘려줄 것을 요청- Publisher는 Subscription 을 통해
Subscriber.onNext()
로 데이터를 전달- 전달이 성공적으로 끝났으면
onComplete()
시그널, 오류가 발생했다면onError()
시그널 발생
- 핵심
Observer pattern
기반에backpressure(배합-압력조절)
개념을 적용
=>publisher
가subscriber
에게push
하는 방식이 아니라, 반대로pull
하는 방식
=>subscriber
가감당할 수 있는 만큼의 데이터
를 수신
- backpressure 개념
: 데이터를 받는 쪽에서 pull하여 적정 데이터양만 수신하여 오류를 방지하는 로직
[ 관계 ]
Project Reactor
는Reactive Streams
의 구현체Spring WebFlux
에서 사용하는reactive library
가 바로Project Reactor
(이하Reactor
)
[ 정의 ]
객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버(Observer)의 목록을 객체에 등록(register)하여
상태 변화가 있을 때 마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
[ 구성 ]
- Subject : 관찰 대상
- Observer : 관찰자
- Subscribe : 관찰자를 관찰 대상이 되는 객체에 등록하는 작업
- Publish / Notiy : 관찰 대상에 변화를 관찰자에게 알리는 작업
[ 특징 ]
- RxJava에 기반이 되는 개념
- 발행/구독 모델로 알려져 있기도 함
- 발행자(Publisher)는 구독자(Subscruber)에게 데이터를 push한다
WebFlux
는Reactive Programming
을 하기 위해Spring5
부터 지원하는reactive-stack
Reactive Programming
을 하기 위해 필요한비동기 서비스 표준 스펙
이Reactive Streams
Reactor
라고 불리는Project Reactor
는Reactive Streams
의구현체
정리
WebFlux
에서Reactive Programming
구현을 위해 사용하는reactive library
가Reactive Streams
의 구현체인Reactor(Project Reactor)
인 것
- 토비의 스프링캠프 [WebFlux] -https://www.youtube.com/watch?v=2E_1yb8iLKk
- 라인 테크 - https://engineering.linecorp.com/ko/blog/reactive-streams-with-armeria-1/
- NHN FORWARD 2020 - https://www.youtube.com/watch?v=I0zMm6wIbRI