Reactive Programmming

Reactive System, Stream, Programming

재심 2025. 1. 1. 15:54

Reactive System, Reactive Stream, Reactive Programming은 모두 비슷한 맥락에서 사용되지만, 각각의 의미와 목적이 약간씩 다르다.

 

 

  • Reactive System: Reactive Manifesto에 정의된 소프트웨어 아키텍쳐. 4가지 원칙이 존재한다.
    • Responsive (응답성)
    • Resilient (복원력)
    • Elastic (유연성)
    • Message-driven (메시지 기반)

 

  • Reactive Programming: Reactive Manifesto에 영향을 받아 비동기 데이터 흐름을 다루는 프로그래밍 기법
    • RxJava
    • RxJs (Javascript)
    • Project Reactor (Spring Webflux)

 

  • Reactive Stream: 데이터 스트림을 비동기적으로 처리하기 위한 표준 명세.
    • Publisher
    • Subscriber
    • Subscription

 

일반적인 프로그램을 Reactive Manifesto를 준수하는 설계로 변경하기 위한 방법들이 여러가지 있을 수 있다.

(자바를 기준으로). 하지만 이러한 기법들은 Reactive Manifesto를 준수하기 힘들다.

 

  • Stream: 데이터를 동기적으로 처리하며 부하 조절을 할 수 없다.
  • Future: 데이터를 비동기적으로 다루지만 부하 조절을 할 수 없다.

 

그럼 '데이터를 비동기적으로 처리' + '배압을 조절' 할 수 있는 방식이 필요한데, 그게 Reactive Stream 기법이다.

 

  • Reactive Stream: 백프레셔를 가지고 비동기 요소들 사이의 상호작용을 정의하는 작은 스펙을 말함. callee는 publisher를 반환하고 caller는 publisher를 subscription (구독) 한다. callee는 메시지를 publish하고, caller는 자신의 상황에 따라 구독해서 메시지를 처리한다.

 

 

Reative Stream의 목적은 비동기이며 배압을 조절하는 스트림 처리의 표준을 명세하는 것.

(명세이므로 인터페이스만 존재하는 것을 볼 수 있다)

 

RxJava, Spring Webflux (Project Reactor) 같은 Reactive Programming 기법들이 Reactive Stream의 명세를 모두 따르고 있다.

(캡쳐는 Project Reactor인데, Reactive Stream의 인터페이스들을 상속하는 모습을 볼 수 있다)

 

 

**참고. java.util.concurrent.Flow

Java 9에서 도입된 Reactive Streams 사양을 기반으로 비동기 데이터 처리를 위한 Publisher-Subscriber 패턴을 구현한 인터페이스 모음을 제공.
이 패키지는 데이터 스트림을 효율적으로 처리하고, 백프레셔(backpressure)를 지원하도록 설계되었다.