리액티브 스프링 #1. Reactive Stream

홍지범·2023년 6월 21일
0

리액티브란?

무엇인가 발생하면 대응하는 방식의 프로그램, 코드

리액티브의 특징 : Duality와 Subscriber

Duality : 같은 기능을 반대 방향으로 표현한 것

Observer 패턴에 대한 간단한 설명

해당 글에서는 Observer 패턴에 대해서는 깊게 다루지 않습니다.
Observer 패턴은 Observable과 Observer를 이용해 Push 방식을 구현하지만 아래 기술할 단점과 더불어 용어가 헤깔릴 수 있으므로 확장된 Observable인 리액티브 스트림(Pub, Sub) 으로 예제를 들겠습니다.

Observer 패턴의 장점

Pull 방식은 미리 정해진 데이터를 끌어다 쓰지만 Push 방식은 소스에서 데이터를 만들어 온다면 해당 소스를 관심있어 하는 모든 Observer에다가 broadcast할 수 있다.

Observable의 문제점

  1. Complete가 없다. : 마지막을 모른다.
  2. Error : Observerble과 Observer를 스레드를 분리해 비동기로 동작시켰을 때 복구 가능한 예외가 발생했더라도 recover할 수 있는 방법이 없다. 직접 구현하더라도 복잡해지고 제시된 표준이 없다.

Duality에 대해 이해해보자

Iterable<---->Publisher
Pull<---->Push
"줘""가져가"
  • Pull : 소스를 쓰는 쪽에서 "값을 줘" 라며 끌어오는 방식
	if(Iterator.hasNext()) {
		Iterator.next();    
    }
    //Pull방식 : 소스를 쓰는 쪽에서 데이터를 요청한다.
  • Push : 값이나 이벤트를 가지고 있는 소스에서 "가져가" 라며 밀어넣는 방식
	...
    subscriber.onNext(Iterator.next());
    ...
    publisher.subscribe(subscriber);
    //Push방식 : 소스에서 데이터가 발생하면 등록된 구독자(subscriber)에게 전달한다.

Duality를 메서드로 이해해보자

Duality : 같은 기능이지만 반대 방향(메서드)로 표현된다.

Data method(void) <--> void method(Data)
//          Pull  <--> Push
//Pull 방식 : 선언한 타입으로 리턴을 받고 파라미터에 데이터를 받는 쪽 넘겨주진 않는다.

//Push 방식 : 리턴타입은 없지만 파라미터에 데이터를 받는 쪽의 정보를 넘겨준다.

Reactive Stream에 대해 알아보자

  • Reactive Stream은 확장된 Observabled이자 Java9의 표준이다.
  • Publisher와 Subscriber로 구성되며 Publisher가 연속된 요소들을 Subscriber들에게 전달해준다.
  • Subscriber를 만들어서 Publisher에게 등록시킨다.
    소스에서 <이벤트, 데이터>가 발생하면 Subscriber에게 주는데, Subscriber는 여러 개가 될 수 있다.

    예)
    Publisher(Source) --> <Event/Data> --> Subcriber

  • 반드시 지켜야 하는 Reactive Stream 프로토콜이 있다.

    onSubscribe onNext* (onError | onComplete)?

    • onSubscribe는 꼭 한 번은 호출되어야 한다.(Sub의 구독 시작)
    • onNext는 한 번도 안일어 날 수도, 한 번만 일어날 수도, 계속 일어날 수도 있다.(0 ~ n)
    • (onError | onComplete) 둘 중 하나만 일어나거나, 둘 다 일어나지 않을 수 있다.
profile
왜? 다음 어떻게?

0개의 댓글