IT/Spring

[리액터] 리액터 개요

김 정 환 2022. 7. 11. 00:27
반응형

 

애플리케이션 코드를 개발할 때는 명령형(imperative)리액티브(reactive)의 두 가지 형태로 코드를 작성할 수 있습니다.

 

명령형은 순차적으로 연속되는 작업이며, 각 작업은 한 번에 하나씩 그리고 이전 작업 다음에 실행됩니다. 리액티브형은 데이터 처리를 위해 일련의 작업들이 정의되지만, 이 작업들은 병렬로 실행될 수 있습니다. 그리고 각 작업은 부분 집합의 데이터를 처리할 수 있으며, 처리가 끝난 데이터를 다음 작업에 넘겨주고 다른 부분 집합의 데이터로 계속 작업할 수 있습니다.

 

 

리액티브 프로그래밍은 순차적으로 수행되는 작업 단계를 나타낸 것이 아니라, 데이터가 흘러가는 파이프라인이나 스트림을 포함합니다. 그리고 리액티브 스트림은 데이터 전체를 사용할 수 있을 때까지 기다리지 않고 사용 가능한 데이터가 있을 때마다 처리되므로 사실상 입력되는 데이터는 무한 할 수 있습니다. 리액티브 스트림은 비동기 백프래셔(backpressure)를 이용하여 비동기 스트림 처리의 표준을 제공하는 것이 목적입니다. 

 

 

 

리액티브 스트림은 4개의 인터페이스인 Publisher(발행자), Subscriber(구독자), Subscription(구독), Processor(프로세서)로 요약할 수 있습니다.

 

Publisher는 하나의 Subscription당 하나의 Subscriber에 발행하는 데이터를 생성합니다. Publisher 인터페이스에는 Subscriber가 Publisher를 구독 신청할 수 있는 subscriber() 메서드 한 개가 선언되어 있습니다.

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

 

Subscriber가 구독 신청되면 Publisher로부터 이벤트를 수신할 수 있습니다. 이 이벤트들은 Subscriber 인터페이스의 메서드를 통해 전송됩니다. Subscriber가 수신할 첫 번째 이벤트는 onSubscribe()의 호출을 통해 이루어집니다. 이 때 인자로 Subscription 객체를 넣어줍니다. Subscriber는 Subscription 객체를 통해서 구독을 관리할 수 있습니다. Subscriber는 request()를 호출하여 전송되는 데이터를 요청하거나, cancel()로 더 이상 데이터를 수신하지 않고 구독을 취소할 수 있습니다. request()는 인자로 데이터 항목 수를 받습니다. 이것이 백 프레셔입니다.

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

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

 

Processer는 Subscrber 인터페이스와 Publisher 인터페이스를 결합한 것입니다. Subscriber 역할로 Processor는 데이터를 수신하고 처리합니다. 그다음에 역할을 바꾸어 Publisher 역할로 처리 결과를 자신의 Subscriber들에게 발행합니다.

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

 

 

 

리액티브 스트림은 꽤 직관적이라서 데이터 처리 파이프라인을 개발하는 방법을 쉽게 알 수 있습니다. Publisher로부터 시작해서 0 또는 그 이상의 Processor를 통해 데이터를 끌어온 다음 최종 결과를 Subscriber에 전달합니다.

반응형