리액티브 시스템(Reactive System)
- 클라이언트의 요청에 반응을 잘하는 시스템
- 클라이언트의 요청에 대한 응답 대기 시간을 최소화 할 수 있도록 요청 쓰레드가 차단되지 않게 함으로써(Non-Blocking) 클라이언트에게 즉각적으로 반응하도록 구성된 시스템
지속적으로 발생하는 데이터를 하나의 데이터 플로우로 보고 데이터를 자동으로 전달한다.
높은 응답성(Responsiveness)
리액티브 스트림즈(Reactive Streams)
- 리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)
Publisher
인터페이스
- 데이터 소스로 부터 데이터를 내보내는(emit) 역할
- 데이터 스트림을 생성하고,
Subscriber
에게 데이터를 전달하는 역할을 한다.subscribe()
메서드를 통해Subscriber
를 등록하고, 데이터를 전달할 준비가 되면onNext()
메서드를 호출하여 데이터를 전송한다.public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
subscribe()
의 파라미터로 전달되는Subscriber
가Publisher
로부터 내보내진 데이터를 소비하는 역할을 한다.
subscribe()
는Publisher
가 내보내는 데이터를 수신할 지 여부를 결정하는 구독의 의미를 가지고 있으며, 일반적으로subscribe()
가 호출되지 않으면Publisher
가 데이터를 내보내는 프로세스는 시작되지 않는다.
Subscriber
인터페이스
Publisher
로부터 내보내진 데이터를 소비하는 역할public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); }
- onSubscribe(Subscription s)
- 이 메서드는
Publisher
로부터Subscription
을 받는다.Subscription
객체를 통해Subscriber
는 데이터 요청 및 취소를 처리할 수 있다.onSubscribe()
메서드에서는 보통Subscription
의request()
메서드를 호출하여 데이터를 요청한다.- onNext(T t)
- 이 메서드는
Publisher
로부터 데이터를 수신할 때 호출된다.- 데이터 처리 로직을 구현하는 곳으로,
Subscriber
는 여기에서 전달받은 데이터를 처리한다.onNext()
메서드가 호출될 때마다 새로운 데이터를 받아 처리할 수 있다.- onError(Throwable t)
- 이 메서드는 데이터 처리 중 오류가 발생했을 때 호출된다.
- 오류 처리 로직을 구현하는 곳으로, 오류가 발생한 경우 이 메서드를 통해
Subscriber
는 오류에 대한 처리를 수행할 수 있다.- onComplete()
- 이 메서드는
Publisher
가 데이터 스트림의 전송이 완료되었음을 알릴 때 호출된다.- 스트림 종료 시 수행할 작업을 구현하는 곳으로, 예를 들어 리소스 해제나 최종 결과를 처리하는 로직을 구현할 수 있다.
Subscription
인터페이스
- Publisher와 Subscriber 사이의 연결을 나타내는 객체로, 데이터 요청 및 취소를 처리한다.
public interface Subscription { public void request(long n); public void cancel(); }
request()
메서드
Subscriber
가 요청한 데이터 양을 지정cancel()
메서드
- 데이터 전송을 중단하는 메서드
- 구독을 해지하는 역할
- 즉, 구독 해지가 발생하면
Publisher
는 더이상 데이터를 emit하지 않는다.
Processor
인터페이스
- Publisher와 Subscriber의 역할을 동시에 수행하여, 데이터 스트림을 변환하거나 조작하는데 사용된다.
- 별도로 구현해야 되는 추상 메서드는 없다.
- 보통 중간에서 데이터 처리를 위한 로직을 적용하기 위해 사용된다.
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
Project Reactor
RxJava
Java Flow API
기타 리액티브 확장(Reactive Extension)
리액티브 시스템은 클라이언트의 요청에 반응을 잘하는 시스템을 의미한다.
리액티브 프로그래밍은 리액티브 시스템에서 사용되는 프로그래밍 모델이다.
리액티브 스트림즈(Reactive Streams)는 리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)이다.
리액티브 스트림즈는 아래의 네 개 컴포넌트로 구성된다.
Publisher
Subscriber
Subscription
Processor
다음과 같은 리액티브 스트림즈의 구현체가 사용된다.
Project Reactor
RxJava
Java Flow API
기타 리액티브 확장(Reactive Extension)
Publisher
는 데이터를 emit하는 역할을 하며, Subsciber
는 Publisher
가 emit한 데이터를 전달 받아서 소비하는 역할을 한다.Publisher
Emit
Subscriber
Subscribe
Signal
Operator(연산자)
Sequence
Upstream / Downstream
선언형 프로그래밍 방식은 실행할 코드를 선언만 하며, 순차적으로 실행되지 않는다.
실행 로직을 작성한 코드대로 실행이 되는 명령형 프로그래밍 방식과 달리 선언형 프로그래밍 방식은 실행 로직의 일부만 람다 표현식으로 전달하며 전달 받은 람다 표현식을 기반으로 Operation 메서드 내부에서 전체 로직을 실행한다.