본문 바로가기
Backend boot camp/Session4

[Spring WebFlux] 리액티브 프로그래밍

by orioncsy 2022. 12. 9.

리엑티브 프로그래밍

개념

Reactive System

  • 클라이언트 요청에 반응을 잘하는 시스템을 의미
  • 클라이언트에게 응답 대기 시간을 최소화하도록 요청 스레드가 차단되지 않게(Non-Blocking) 하여 즉각 반응하도록 구성된 시스템

Reactive System 설계 원칙

  • MEANS
    • 커뮤니케이션 수단을 의미
    • Message Driven : 메시지 기반 통신을 통해 여러 시스템 간 느슨한 결합 유지
  • FORM
    • 메시지 기반 통신을 통해 어떤 특성을 가지는 구조로 형성되는지 의미
    • Elastic : 요청량에 상관없이 일정한 응답성 유지
    • Resillient : 일부분에 장애가 발생하더라도 응답성 유지
  • VALUE
    • 리액티브 시스템의 핵심 가치
    • Responsive : 클라이언트의 요청에 즉각 응답
    • Maintainable : 즉각적인 응답이 지속 가능해야 함
    • Extensible : 요청에 대한 처리량을 자동으로 확장 및 축소 가능해야 함

리엑티브 프로그래밍

리액티브 프로그래밍의 특징

  • declarative programming paradigm
    • 선언형 프로그래밍 방식 사용
  • data streams and the propagation of change
    • 지속적으로 데이터가 입력으로 들어올 수 있으며 데이터에 변경이 발생함
    • 변경 자체를 이벤트로 간주하고 이벤트 발생마다 데이터 전달
  • automatic propagation of the changed data flow
    • 지속적으로 발생하는 데이터를 하나의 data flow로 보고 전달

Reactive Streams Component

  • Publisher
    • 데이터 소스로부터 데이터를 내보내는 역할
    public interface Publisher<T> {
        public void subscribe(Subscriber<? super T> s);
    }
    
    • subscribe() 메서드는 Publisher가 보내는 데이터를 수신할지 여부를 결정하는 구독의 의미
  • Subsriber
    • Publisher로부터 내보내진 데이터를 소비하는 역할
    • 네 개의 추상 메서드를 포함하고 있다.
    • public void onSubscribe(Subscription s)
      • 구독이 시작되는 시점에 호출, onSubscribe 내 Publisher에게 요청할 데이터 개수 지정하거나 구독 해지 처리
    • public void onNext(T t)
      • Publisher가 데이터를 emit할 때 호출, emit된 데이터를 받아서 소비
    • public void onError(Throwable t)
      • Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에 에러가 발생할 경우 호출
    • public void onComplete()
      • Publisher가 emit하는 과정이 종료될 경우 호출, 정상적으로 emit이 되고 처리해야될 작업이 있다면 처리
  • Subscription
    • 구독 자체를 표현한 인터페이스
    • public void request(long n)
      • Publisher가 emit하는 데이터 개수 요청
    • public void cancel()
      • 구독을 해지하는 역할
  • Processor
    • Subscriber와 Publisher 인터페이스를 상속
  • public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }

Reactive Streams 구현체

  • Project Reactor
    • 줄여서 Reactor라고 부르는데, Spring과 잘 맞는 reactive streams 구현체이다.
  • RxJava
    • .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java언어로 포팅한 JVM기반의 리액티브 확장 라이브러리
  • Java Flow API
    • 리액티브 스트림즈 표준 사양을 Java 안에 포함시킨 구조
    • SPI(Service Provider Interface) 역할을 다양한 구현체들이 존재
  • Reactive Extension
    • Rx(Reactive Extension)
    • 다양한 프로그래밍 언어에서 리액티브 스트림즈를 구현한 Rx 라이브러리 제공
    • RxJava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala

리엑티브 프로그래밍 구조

명령형 프로그래밍 VS 선언형 프로그래밍

명령형 프로그래밍

  • 코드가 어떤 식으로 실행되어야 하는지에 대한 구체적인 로직이 드러난다.
  • 예를 들면 For문을 돌아서 if문으로 조건을 보고 작업 수행

선언형 프로그래밍

  • Stream API를 사용하여 내부 반복자가 for문을 대체
  • filter 메서드는 if문을 대신해 조건을 살핀다.
  • stream에 중간 연산에는 이러한 작업을 해달라는 요청만 람다 표현식으로 넘기고 최종 연산이 호출될 때 전달받은 표현식 기반으로 동작 수행
  • 필요한 동작들을 개발자가 작성하지 않고 구체적인 동작 수행은 연산 메서드 체인에 위임

리액티브 프로그래밍 용어

Flux
            .fromIterable(List.of(1, 2, 4, 8, 9, 11))
            .filter(number -> number > 1 && (number % 2 == 0))
            .reduce((n1, n2) -> n1 + n2)
            .subscribe(System.out::println);

Publisher

  • 데이터를 내보내는(emit) 주체를 의미
  • Flux가 publisher

Emit

  • Publisher가 데이터를 내보내는 것

Subscriber

  • Publisher가 emit한 데이터를 전달받아서 소비하는 주체
  • subscribe(System.out::println)

Subscribe

  • 구독을 의미
  • subscribe() 메서드 호출

Signal

  • Publisher가 발생시키는 이벤트
  • subscribe() 메서드가 호출되면 Flux는 숫자 데이터를 하나씩 emit한다.
  • 숫자 데이터를 emit 하는 것이 이벤트 발생을 간주하고 이것을 다른 컴포넌트에게 전달하는 것을 signal을 전송한다고 표현

Operator

  • 어떤 동작을 수행하는 메서드를 의미
  • fromIterable(), filter(0, redue() 등을 operator라고 부른다.

Sequence

  • Operator 체인으로 표현되는 데이터의 흐름

Upstream/ DownStream

  • sequence 상의 특정 Operation을 기준으로 위쪽 sequence 일부를 Upstream, 아래를 DownStream

'Backend boot camp > Session4' 카테고리의 다른 글

[Spring WebFlux] Spring WebFlux  (0) 2022.12.09
[Spring WebFlux] Reactor  (0) 2022.12.09
[Spring Security] OAuth 2  (0) 2022.12.09
[Spring Security] JWT 인증  (0) 2022.12.09
[Spring Security] Spring Security 기본  (0) 2022.11.19