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

zini9188·2023년 3월 29일

Spring WebFlux

목록 보기
1/3

리액티브 프로그래밍

  • 선언형 프로그래밍 방식

  • 메세지 기반 통신

  • Non-Blocking 통신을 위한 프로그래밍

    • 클라이언트 요청에 대한 응답 대기 시간을 최소화할 수 있도록 요청 쓰레드가 차단되지 않도록 하는 것
  • 지속적으로 데이터의 입력을 받으며, 하나의 데이터 플로우로서 데이터를 전달

리액티브 시스템의 특징

  • MEANS: 리액티브 시스템에서 사용하는 커뮤니케이션 수단

    • Message Driven: 메세지 기반 통신으로 시스템 간에 느슨한 결합을 유지
  • FORM: 리액티브 시스템이 메세지 기반 통신을 통해 어떠한 구조로 형성되는지를 의미

    • Elastic: 시스템으로 들어오는 요청량에 상관없이 일정한 응답성을 유지하는 것
    • Resilient: 시스템 일부에 장애가 발생하더라도 응답성을 유지하는 것
  • VALUE: 리액티브 시스템의 핵심 가치가 무엇인지 표시하는 영역

    • Responsive: 클라이언트의 요청에 즉각적으로 응답할 수 있음을 의미

    • Maintainalbe: 클라이언트의 요청에 대한 즉각적인 응답이 지속 가능해야 함을 의미

    • Extensible: 클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함을 의미

리액티브 스트림즈

  • 리액티브 프로그래밍을 위한 표준 사양

  • Publisher, Subscriber, Subscription, Processor

Publisher

  • 데이터 소스로부터 데이터를 내보내는(Emit) 역할
public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s); //(1)
}

(1): 데이터를 수신할 지 여부를 결정하는 구독의 의미

Subscriber

  • Publisher로부터 내보내진 데이터를 소비하는 역할
public interface Subscriber<T> {
    public void onSubscribe(Subscription s); //(1)
    public void onNext(T t); //(2)
    public void onError(Throwable t); //(3)
    public void onComplete(); //(4)
}

(1): 구독이 시작되는 시점에 호출되며, onSubscribe() 내에서 Publisher에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리

(2): Publisher가 데이터를 emit할 때 호출되어, emit된 데이터를 전달받아 소비

(3): emit된 데이터가 전달되는 과정에서 에러가 발생하는 경우에 호출

(4): emit 과정이 종료되는 경우 호출되며, 정상적으로 완료된 후 처리할 작업이 있으면 onComplete()내에서 수행

Subscription

public interface Subscription {
    public void request(long n); // (1)
    public void cancel(); // (2)
}

(1): emit하는 데이터의 개수를 요청

(2): 구독을 해지하여 emit을 종료

Processor

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
  • Publisher와 Subscriber의 역할을 동시에 할 수 있음

구현체

Project Reactor, RxJava, JavaFlowAPI, 기타 리액티브 확장(Reactive Extension)

profile
똑같은 짓은 하지 말자

0개의 댓글