1. 리액티브 시스템에 대해 알 수 있다.
2. 리액티브 프로그래밍에 대해 알 수 있다.
3. 리액티브 스트림즈에 대해 알 수 있다.
4. 코드를 통해 리액티브 프로그래밍 구조에 대해 알 수 있다.
- 리액티브 시스템 (Reactive System)
✔︎ 클라이언트의 요청에 반응을 잘하는 시스템
✔︎ MEANS
: 리액티브 시스템에서 사용하는 커뮤니케이션 수단을 의미
✔︎ FORM
: 메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지 의미
✔︎ VALUE
: 리액티브 시스템의 핵심 가치가 무엇인지 표현하는 영역
- 리액티브 프로그래밍 (Reactive Programming)
✔︎ 리액티브 시스템에서 사용되는 프로그래밍 모델
✔︎ declarative programming paradigm
✔︎ data streams and the propagation of change
✔︎ automatic propagation of the changed data flow
data stream and the propagation of change
와 같은 의미
- 리액티브 스트림즈 (Reactive Streams)
✔︎ 리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)
✔︎ Publisher
public interface Publisher<T> {
public void subscribe(Subscribeer<? super T> s);
}
emit
) 역할subscribe()
: 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할✔︎ Subscriber
public interface Subscsriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
onSubscribe(Subscription s)
: 구독이 시작되는 시점에 호출, onSubscribe() 내 Publisher에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리 가능onNext(T t)
: Publisher가 데이터를 emit할 때 호출, emit된 데이터를 전달받아 소비 가능onError(Throwable t)
: Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출onComplete()
: Publisher가 데이터를 emit하는 과정이 종료될 경우 호출, 데이터의 emit이 정상적으로 완료된 후 처리해야할 작업이 있다면 onComplete() 내에서 수행✔︎ Subscription
public interface Subsvription {
public void request(long n);
public void cancel();
}
request(long n)
: Publisher가 emit하는 데이터의 개수를 요청cancel()
: 구독을 해지하는 역할, 구독 해지 발생시 Publisher는 더이상 데이터를 emit ❌✔︎ Processor
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
Subscriber 인터페이스
와 Publisher 인터페이스
를 상속하고 있기 때문에 역할을 동시에 할 수 있음✔︎ Project Reactor (Reactor)
✔︎ RxJava
.NET
기반의 리액티브 라이브러리를 넷플릭스에서 Java 언어로 포팅한 JVM 기반의 리액티브 확장 라이브러리✔︎ Java Flow API
✔︎ 기타 리액티브 확장 (Reactive Extension)
- 리액티브 프로그래밍 구조
✔︎ 실행할 코드를 선언만 함, 순차적 실시 ❌
✔︎ 실행 로직을 작성한 코드대로 실행이 되는 명령형 프로그래밍 방식과 달리,
실행 로직의 일부만 람다 표현식으로 전달하며 전달 받은 람다 표현식을 기반으로 Operation 메서드 내부에서 전체 로직을 실행
✔︎ Publisher
✔︎ Emit
✔︎ Subscriber
✔︎ Subscribe
✔︎ Signal
✔︎ Operator
✔︎ Sequence
✔︎ Upstream / DownStream
☞ 지금까지 학습한 명령형 프로그래밍 방식과 다르게 선언형 프로그래밍 방식을 사용하면서 코드 구조 자체가 낯설게 느껴졌다. 이전에 스트림에 대해 공부하긴 했지만 아직까지 어색한 느낌 😅 Spring WebFlux에 대한 어려움은 강사님으로부터 듣긴 했다만은 사고 자체를 바꿔 적응하는 데 아직 시간이 걸릴 것 같다. 내일도 학습하면서 좀 더 친해지도록 해야겠다.
・ Project Reactor
・ 마블 다이어그램 & 스케쥴러
・ Operator