WebFlux (1) - 관련 키워드

김정욱·2021년 10월 25일
1

WebFlux

목록 보기
3/5
post-thumbnail
post-custom-banner

WebFlux 이해의 시작

[ WebFlux 간단 소개 ]

  • Spring의 reactive-stack web framework
  • Srpring5에서 새롭게 추가된 모듈
    (기존의 Spring MVC 모듈과 자주 비교된다)

[ WebFlux 이해 준비 ]

  • webflux는 기존에 많이 사용하던 SpringMVC 와 필요한 개념들이 많이 다르다
  • 그래서, 막상 공부하려면 reactive programming, reactor 등 많은 새로운 개념들을 공부하게 된다
  • 중요한 것은 우선 관련 키워드의 개념과 키워드간 연관관계를 알고가는 것이라고 생각한다

WebFlux 관련 키워드

[ Reactive Programming ]

[ WebFlux와 관계 ]

  • Webflux는 결국 Reactive Programming을 목적으로 하는 도구이다

[ 개념 ]

  • 작성한 코드의 순서대로 진행되는 기존의 명령형 프로그램과 다르게 데이터의 흐름을 먼저 정의하고, 데이터의 변화 혹은 작업의 종료에 따라 반응하여 진행되는 프로그래밍
  • 실시간 변화(이벤트 등)에 반응하는 것을 중점으로 둔 프로그래밍 모델

[ 특징 ]

  • 비동기 이벤트 처리를 위해 Observer패턴을 기반으로 동작
  • 비동기적인 데이터의 Stream으로 간주하고, Observer 패턴을 활용해서 비동기 이벤트를 처리
  • 함수형 프로그래밍의 지원을 통해서 스레드 안정성을 보장 받는다
    => 데드락, 동기화 문제에서 벗어날 수 있다

[ Reactive Streams ]

[ 정의 ]

  • 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) 구독자 중 기준에 일치하는 구독자들에게만 전송 / 멀티캐스팅

[ 전체 흐름 ]

  • 동작 순서
    1. Subscriber가 subscribe() 메서드를 통해 Publisher에게 구독 요청
    2. Publisher는 onSubscribe() 메서드로 Subscription을 Subscriber에게 전달
    3. Subscriber는 Subscription.request()를 통해, 자신에게 데이터를 흘려줄 것을 요청
    4. Publisher는 Subscription 을 통해 Subscriber.onNext()로 데이터를 전달
    5. 전달이 성공적으로 끝났으면 onComplete() 시그널, 오류가 발생했다면 onError() 시그널 발생
  • 핵심
    • Observer pattern 기반에 backpressure(배합-압력조절) 개념을 적용
      => publishersubscriber에게 push하는 방식이 아니라, 반대로 pull 하는 방식
      => subscriber감당할 수 있는 만큼의 데이터를 수신
    • backpressure 개념
      : 데이터를 받는 쪽에서 pull하여 적정 데이터양만 수신하여 오류를 방지하는 로직

[ Project Reactor ]

[ 관계 ]

  • Project ReactorReactive Streams의 구현체
  • Spring WebFlux에서 사용하는 reactive library가 바로 Project Reactor(이하 Reactor)

[ Observer 패턴 ]

[ 정의 ]

객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버(Observer)의 목록을 객체에 등록(register)하여
상태 변화가 있을 때 마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴


[ 구성 ]

  • Subject : 관찰 대상
  • Observer : 관찰자
  • Subscribe : 관찰자를 관찰 대상이 되는 객체에 등록하는 작업
  • Publish / Notiy : 관찰 대상에 변화를 관찰자에게 알리는 작업

[ 특징 ]

  • RxJava에 기반이 되는 개념
  • 발행/구독 모델로 알려져 있기도 함
  • 발행자(Publisher)는 구독자(Subscruber)에게 데이터를 push한다

키워드 관계 정리

  • WebFluxReactive Programming을 하기 위해 Spring5부터 지원하는 reactive-stack
  • Reactive Programming을 하기 위해 필요한 비동기 서비스 표준 스펙Reactive Streams
  • Reactor라고 불리는 Project ReactorReactive Streams구현체

정리

  • WebFlux에서 Reactive Programming 구현을 위해 사용하는 reactive libraryReactive Streams의 구현체인 Reactor(Project Reactor) 인 것

refs

profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글