본문 바로가기
Develop/Spring

Spring Webflux - Reactive Programming

by jaeyoungb 2022. 11. 29.

Reactive System 특징

Ref - https://www.reactivemanifesto.org/

 

Reactive System

MEANS - Reactive System에서 사용하는 커뮤니케이션 수단이다.

  • Message Driven - 메시지 기반의 통신을 통해 여러 시스템 간에 느슨한 결합을 유지한다.

FORM - 메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지 의미한다.

  • Elastic - 시스템으로 들어오는 요청량에 상관없이 일정한 응답성을 유지하는 것을 의미한다.
  • Resillient - 시스템의 일부분에 장애가 발생하더라도 응답성을 유지하는 것을 의미한다.

VALUE - Reactive System의 핵심 가치가 무엇인지를 표현하는 영역이다.

  • Responsive - 클라이언트의 요청에 즉각적으로 응답할 수 있어야 한다는 것을 의미한다.
  • Maintainable - 클라이언트의 요청에 대한 즉각적인 응답이 지속 가능해야 한다는 것을 의미한다.
  • Extensible - 클라이언트의 요청에 대한 처리량을 자동으로 확장 및 축소할 수 있어야 하는 것을 의미한다.

- https://www.reactivemanifesto.org/

 

Reactive Programming

Reactive Programming은 선언형 프로그래밍 방식을 사용하고, Reactive System에서 사용되는 대표적인 프로그래밍 모델을 의미한다. 메시지 기반의 통신은 Non-Blocking 통신과 유기적인 관계를 맺고 있고, Non-Blocking 통신을 위한 프로그래밍 모델이다.

 

Reactive Streams

리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)이다.

(일반적으로 Java의 interface로 정의)

- https://github.com/reactive-streams/reactive-streams-jvm

 

Components of Reactive Streams

✔ Publisher

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

Publisher 인터페이스는 데이터 소스로 부터 데이터를 내보내는(emit) 역할을 한다.

✔ Subscriber

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

Subscriber 인터페이스는 Publisher로부터 내보내진 데이터를 소비하는 역할을 한다.

✔ Subscription

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

Subscription 인터페이스는 Subscriber의 구독 자체를 표현한 인터페이스이다.

✔ Processor

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

Publisher와 Subscriber의 역할을 동시에 할 수 있는 특징을 가지고 있다.

 

Implementation of Reactive Streams

  • Project Reactor (=Reactor) - 대표적인 구현체로, Spring과 궁합이 가장 잘 맞는 Reactive Streams 구현체이다.
  • RxJava - .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java 언어로 포팅한 JVM 기반의 리액티브 확장 라이브러리이다.
  • Java Flow API - Reactive Streams 표준 사양을 Java 안에 포함시킨 구조이다.
  • Reactive Extension - 리액티브 스트림즈를 구현한 리액티브 확장(Reactive Extension) 라이브러리이다.
    (RxJave, RxJS, RxAndroid, RxKotlin, RxPython, RxScala 등)
    - https://reactivex.io/

 

Terms of Reactive Programming

  • Publisher - 데이터를 내보내는 주체를 의미한다.
  • Emit - Publisher가 데이터를 내보내는 것을 Emit이라고 한다.
  • Subscriber - Publisher가 emit한 데이터를 전달 받아서 소비하는 주체를 의미한다.
  • Subscribe - 구독을 의미하고, subscribe() 메서드를 호출하면 구독을 하는 것이다.
  • Signal - Publisher가 발생시키는 이벤트를 의미한다.
  • Operator - Reactive Programming에서 어떤 동작을 수행하는 메서드를 의미한다.
  • Sequence - Operator 체인으로 표현되는 데이터의 흐름을 의미한다.
  • Upstream / Downstream - Sequence 상의 특정 Operator를 기준으로 위쪽의 Sequence 일부를 Upstream, 아래 쪽 Sequence 일부를 Downstream이라고 표현한다.

 

## Reactive Programming은 선언형 프로그래밍 방식이다. 이는 Java의 Stream API와 선언형 프로그래밍 방식으로 구성된다는 공통점이 있지만, Stream API와는 차이점이 더 많고, 용도 역시 확연히 다르다.

 

'Develop > Spring' 카테고리의 다른 글

Spring WebFlux  (0) 2022.12.01
Spring WebFlux - Reactor (Project Reactor)  (0) 2022.11.30
OAuth 2 + JWT 샘플 애플리케이션 구현  (0) 2022.11.29
OAuth 2 샘플 애플리케이션 구현  (0) 2022.11.28
OAuth2 개요  (0) 2022.11.25