본문 바로가기
Spring

[Spring Webflux] 리액티브 프로그래밍이란? / 리액티브 스트림즈 컴포넌트

by jungha_k 2022. 11. 29.

리액티브 시스템 (Reactive System) 이란?

: 클라이언트의 요청에 반응을 잘하는 시스템

 

= 클라이언트의 요청에 대한 응답 대기 시간을 최소화하기 위해

요청 쓰레드가 차단되지 않도록 함!(Non-Blocking)

 

클라이언트에게 즉각적으로 반응하도록 구성된 시스템

 


 

https://www.reactivemanifesto.org/

 

리액티브 시스템 설계 원칙

 

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

  • Message Driven : 메세지 기반 통신 ➡ 시스템들 간에 느슨한 결합 유지

FORM : 어떤 특성을 가지는 구조로 형성되는지 

  •  Elastic : 시스템 요청량에 상관없이 일정한 응답성 유지
  • Resilient : 시스템 일부분에 장애 발생해도 일정한 응답성 유지

VALUE : 리액티브 시스템의 핵심 가치

  • Responsive : 클라이언트의 요청에 즉각적으로 응답해야 함
  • Maintainable : 클라이언트의 요청에 즉각적 응답 지속가능해야 함
  • Extensible : 클라이언트 요청 처리량을 자동 확장, 축소 가능해야 함

리액티브 프로그래밍 (Reactive Programming) 이란? 

: 리액티브 시스템에서 사용되는 프로그래밍 모델

: Non-Blocking 통신을 위한 프로그래밍 모델

 

 

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

 

1) declarative programming paradigm

: 선언형 프로그래밍 방식 사용

 

 

2) data streams and the propagation of change

: 지속적 데이터 입력, 발생 = 데이터에 변경이 발생하는 것

데이터의 변경 = '이벤트' ➡ 이벤트 발생마다 데이터 계속해서 전달

 

 

3) automatic propagation of the changed data flow

: 지속적으로 발생하는 데이터 = 하나의 데이터 플로우

데이터를 자동으로 전달


리액티브 스트림즈 (Reactive Streams) 란?

: 리액티브 프로그래밍을 위한 표준 사양(= 명세)

ex) ORM의 표준사양 ➡ JPA / 데이터베이스 액세스 표준사양 ➡ JDBC

 

 

Java - 인터페이스로 어떤 기술의 표준 사양을 코드로 정의함

 

리액티브 스트림즈 컴포넌트 (구성요소) : 사양으로 정의된 것들

  • Publisher
  • Subscriber
  • Subscription
  • Processor

 

✨ Publisher : 데이터 소스로부터 데이터를 내보내는(emit) 역할

public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s);
}

subscribe() 추상 메서드 포함 ➡ 호출되지 않으면 Publisher 가 데이터 내보내는 프로세스 시작되지 않는다!

(구독? = Publisher가 내보내는 데이터 수신할지 여부 결정)

 

 

Subscriber : Publisher로부터 내보내진 데이터 소비

public interface Subscriber<T> {
    public void onSubscribe(Subscription s); 
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}

네 개의 추상 메서드 포함

  • onSubscribe(Subscription s) : 구독 시작 시점에 호출, Publisher에게 요청할 데이터 개수 지정, 구독 해지 처리 
  • onNext(T t) : 데이터 emit 시 호출, emit 된 데이터 전달받아 소비 가능
  • onError(Throwable t) : Publisher ➡ Subscriber emit 데이터 전달과정 중 에러 발생시 호출
  • onComplete() : Publisher가 데이터 emit 과정 종료시 호출 (emit 정상 완료 후 처리할 작업 필요시)

 

 

Subscription : Subscriber의 구독 자체를 표현

public interface Subscription {
    public void request(long n); // Publisher의 emit 데이터 개수 요청
    public void cancel(); // 구독 해지 역할 (더이상 데이터 emit X)
}

 

 

Processor : Subscriber 인터페이스 + Publisher 인터페이스 상속

* 별도 구현 추상 메서드 無

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

리액티브 스트림즈의 구현체 :

사양에 맞게 구현된 구현체들

 

  • Project Reactor : 리액티브 스트림즈 대표적인 구현체
  • RxJava : .NET 기반 리액티브 라이브러리
  • Java Flow API : 리액티브 스트림즈 표준 사양을 Java 안에 포함시킴
  • Reactive Extension : 특정 언어에서 리액티브 스트림즈 구현
    ex) Rxjava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala

 

 

댓글