티스토리 뷰

728x90
반응형

목차

     

    지난 글에서 리액티브 시스템이란 쉽게 말해 반응 속도가 빠른 프로그램을 설계하는 원칙이며

     

    리액티브 프로그래밍은 그 원칙을 구현하는 논 블로킹, 비동기 방식의 선언형 개발 패러다임이라 했었다.

     

    2022.10.12 - [Development/Spring] - [Spring]리액티브 프로그래밍(Reactive Programming)

     

    [Spring]리액티브 프로그래밍(Reactive Programming)

    리액티브 프로그래밍(Reactive Programming)이란 논 블로킹, 비동기 데이터 흐름 및 새로운 정보의 가용성에 기반을 둔 선언형 개발 패러다임이다. 또는 리액티브 시스템을 구현하는 방법이자 하위 개

    gnidinger.tistory.com

    이번 글에선 리액티브 프로그래밍의 표준 사양리액티브 스트림즈에 대해 알아보자.

     

    Reactive Streams

     

    리액티브 스트림즈리액티브 프로그래밍을 위한 자바 진영의 표준 명세(Specification), 즉 인터페이스의 모음이다.

     

    조금 더 구체적으로는 논 블로킹 백 프레셔를 가진 비동기 스트리밍 프로세싱에 대한 표준이라고 할 수도 있다.

     

    Stream Processing

     

    스트림 프로세싱데이터 스트림이나 이벤트 시퀀스를 컴퓨팅의 중심으로 보는 프로그래밍 패러다임을 말한다.

     

    또한 개념적으로 Reactive Programming, Dataflow Programming, Distributed Data Processing을 포함하며

     

    병렬 처리에 강점을 가지고 있다.

     

    서론이 길었지만 단순하게 설명하자면 스트림 프로세싱Out Of Memory 에러와 대량의 Garbage Collection에서

     

    애플리케이션을 보호하는 역할을 한다.

     

    이는 이름 그대로 기존 방식처럼 요청과 그에 따른 데이터를 전부 메모리에 올리는 대신 스트림을 이용

     

    지금 당장 처리할 데이터만 메모리에 올리는 식으로 이루어진다.

     

    Back Pressure

     

    Back Pressure는 이벤트를 보내는 쪽에서가 아니라 받고 처리하는 쪽에서 먼저 요청(Pull)하는 방식을 말한다.

     

    퍼블리셔와 구독자의 연산속도 차이에 의한 CPU, 메모리, 네트워크의 낭비와 Out Of Memory 에러 발생을 방지한다.

     

    스트림 프로세싱과 Back Pressure의 공통점은 스트림을 다룰 때

     

    Input의 양이 Output 생성속도를 크게 웃도는 환경을 방지해 병렬 처리에 유리한 상황을 만드는 데 있다.

     

    따라서 이와같은 작업을 지난 글에서 알아본 대로 논 블로킹, 비동기 방식으로 처리하는 것이

     

    리액티브 스트림즈의 목적이라 할 수 있다.

     

    계속해서 리액티브 스트림즈를 구성하고 있는 명세, 인터페이스에 대해서 살펴보자.

     

    Components of Reactive Streams

     

    Pubilsher<T>

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

    퍼블리셔 인터페이스는 데이터 소스로부터 데이터를 내보내는(Emit) 역할을 한다.

     

    subscribe() 추상 메서드를 가지고 있으며, 해당 메서드의 매개변수가 데이터를 요청 및 소비하는 역할을 한다.

     

    추가로 위에서 알아본 대로 Subscriber(매개변수)가 이벤트를 요청하지 않는 이상 먼저 데이터를 Emit하지 않는다.

     

    Subscriber<T>

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

    네 개의 추상 메서드를 가진 Subscriber 인터페이스는 데이터를 요청하고 소비하는 역할을 한다.

     

    각 메서드의 역할은 아래와 같다.

     

    Method Description
    onSubscribe(Subscription s) 구독 시작되는 시점에 호출. 요청할 데이터의 개수 지정 및 구독 해지 처리 가능
    onNext(T t) 퍼블리셔가 데이터를 Emit할 때마다 호출. 데이터를 전달받아 소비한다.
    onError(Throwable t) 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출
    onComplete() Emit 과정이 종료되는 시점에 호출. Emit 이후의 처리작업 수행

     

    Subscription

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

    이름 그대로 구독 자체를 관리하는 인터페이스이다.

     

    각 메서드의 기능은 아래와 같다.

     

    Method Description
    request(long n) 퍼블리셔에게 Emit할 데이터의 개수를 담아 요청
    cancel() 구독 해지. 발생시 퍼블리셔는 Emit을 멈춘다.

     

    Processor<T, R>

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

    Subscriber와 Publisher를 동시에 상속받고 있는 인터페이스이다.

     

    두 역할을 동시에 수행하는 것이 가능하다.

     

    위 인터페이스 사이의 관계를 계통도로 나타내면 아래와 같다.

     

    계속해서 작업의 흐름을 나타내면 다음과 같이 된다.

     

     

    Implementors of Reactive Streams

     

    리액티브 스트림즈는 인터페이스의 모음이니 당연히 구현체가 존재한다.

     

     

    Implementor Description
    Project Reactor Spring5의 리액티브 스택에 포함된 구현체. Spring과 가장 궁합이 잘 맞는다.
    RxJava .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java로 포팅한 확장 라이브러리.
    Java Flow API 리액티브 스트림즈 표준 사양을 Java 안에 포함시킨 구현체. SPI(Service Provider Interface) 역할
    Reactive Extensions RxJS, RxAndroid, RxKotlin, RxPython, RxScala 등이 있음
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2025/01   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함