거꾸로 바라본 세상
Published 2023. 5. 2. 09:22
[Spring] Reactive Stream 개요 Spring
반응형

리엑터 개요

애플리케이션 코드를 개발할 때 명령형(Imperative)과 리엑티브(Reactive) 두 가지 형태로 코드를 작성할 수 있다.

  • 명령형 : 순차적으로 연속되는 작업이고, 각 작업은 한 번에 하나씩 그리고 이전 작업 다음에 실행한다. 데이터는 모아서 처리되고 이전 작업 데이터 처리를 끝낸 후에 다음 작업으로 넘어갈 수 있다.
  • 리엑티브(반응형) : 데이터 처리를 위해 일련의 작업이 병렬로 실행될 수 있으며, 각 작업은 부분집합의 데이터를 처리할 수 있고, 처리가 끝난 데이터는 다음 작업에 남겨주고 다른 부분집합의 데이터로 계속 작업할 수 있다.

이런 리액터 프로젝트는 비동기 파이프라인을 구축할 때 콜백 지옥과 깊게 중첩된 코드를 생략하는 목적으로 설계되었다.

  • 리액터 1.x는 배압조절 기능이 없다.
  • 리액터 2.x 버전에서는 리액터 스트림 API가 RxJava API와 비슷해지고, 스트림을 생성하고 소비하는 간단한 추가사항 외에도 배압관리, 스레드 처리, 복원력 지원등을 위한 다양한 기능이 추가되었다.

리엑티브 프로그래밍

보통 대부분의 언어는 동시 프로그래밍을 지원하고 스레드로 동시성을 관리하는 것은 쉽지 않은데 스레드가 많은 수록 더 복잡하기 때문이다.

리액티브 프로그래밍은 명령형 프로그래밍의 대안이 되는 패러다임으로 본질은 함수적이면서 선언적이다.

즉, 순차적으로 처리하는 작업단계가 아니라 데이터가 흘러가는 파이프라인(pipeline)이나 스트림(stream)을 포함한다.

또한 데이터 전체를 사용할 수 있을 때까지 기다리지 않고 사용가능한 데이터가 있을 때마다 처리되므로 입력되는 데이터는 무한할 수 있다.

리엑티브 스트림 정의

리엑티브 스트림은 4개의 인터페이스로 정의할 수 있다.

  • publisher(발행자)
  • Subscriiber(구독자)
  • Subscription(구독)
  • Processor(프로세서)

Publisher는 하나의 Subscription당 Subscriber에 발행(전송)하는 데이터를 생성한다.

Publisher 인터페이스에는 Subscriber가 Publisher를 구독 신청할 수 있는 Subscribe() 메서드 한개를 선언


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

Subscriber가 구독 신청되면 Publisher로 부터 이벤트르 수신할 수 있고, 이 이벤트들은 Subscriber 인터페이스의 메서드를 통해 전송

public interface Subscriber<T> {
    void onSubscribe(Subscription sub);
    void onNext(T imte);
    void onError(Throwable ex);
    void OnComplete();
}

Subscriber가 수신할 첫 번째 이벤트는 onSubscribe()의 호출을 통해 이루어지며, Publisher가 onSubscribe()를 호출할 때 이 메서드의 인자로 Subscription() 객체를 Subscriber에 전달.

Subscriber는 Subscription객체를 통해 구독을 관리

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

Subscriber는 request()를 호출하여 전송되는 데이터를 요청하거나, 더 이상 데이터를 수신하지 않고 구독을 취소하는 것을 나타내기 위해 cancel()를 호출할 수 있다.

request()를 호출할 때 Subscriber는 받고자 하는 데이터의 항목 수를 나타내는 long 타입의 값을 인자로 전달하는데 이것을 백 프레셔(Back-Pressure)라고 하며 Subscriber가 처리할 수 있는 것보다 더 많은 데이터를 Publisher가 전송되는 것을 막아준다.

백 프레셔(Back-Pressure) : 데이터가 소비하는(읽는) 컨슈머가 처리하 수 있는 만큼 전달 데이터를 제한하여 빠른 데이터 소스로부터 데이터 전달 폭주를 피할 수 있는 수단.

Subscriber의 요청이 완료되면 데이터가 스트림을 통해 전달되며, onNext() 메서드가 호출되어 Publisher가 전송하는 데이터가 Subscriber에게 전달되고 에러가 발생할 경우 onError()를 호출한다.

그리고 Publisher에서 전송할 데이터가 없고, 데이터를 생성하지 않는다면 Publisher가 onComplete()를 호출하여 작업이 끝난다고 Subscriber에게 알려준다.

Processor 인터페이스는 Subscriber 인터페이스와 Publisher 인터페이스를 결합한 것

public interface Porcessor<T, R> extends Subscriber<T>, Publisher<R> {

}

Processor는 데이터를 수신하고 처리한 후 Publisher는 처리 결과를 자신의 Subscriber에게 발행한다.

반응형

'Spring' 카테고리의 다른 글

[Srping Reactor] 리액티브 오퍼레이션  (0) 2023.05.02
Spring Reactor 시작하기  (0) 2023.05.02
@EventListener를 사용한 발행-구독 패턴  (0) 2023.05.02
AOP(Aspect Oriented Programming)  (0) 2023.03.31
[Spring Framework] IOC/DI  (0) 2023.03.29
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!