✔ 리액티브 시스템의 특징
- MEANS
리액티브 시스템에서 사용하는 커뮤니케이션 수단
- Message Driven
리액티브 시스템에서는 메시지 기반 통신을 통해 여러 시스템간에 느슨한 결합을 유지- FORM
메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지 의미
- Elastic
시스템으로 들어오는 요청량이 적거나 많거나 상관없이 일정한 응답성 유지하는것을 의미- Resillient
시스템 일부분에 장애가 발생하더라도 응답성 유지하는 것을 의미- VALUE
리액티브 시스템의 핵심 가치가 무엇인지를 표현하는 영역
- Responsive
리액티브 시스템은 클라이언트의 요청에 즉각적으로 응답할 수 있어야 함을 의미- Maintainable
클라이언트의 요청에 대한 즉각적인 응답이 지속가능해야 함을 의미- Extensible
클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함을 의미
✔ 리액티브 프로그래밍 특징
- declarative programming paradigm
- 선언형 프로그래밍 방식을 사용하는 대표적인 프로그래밍 모델
- data streams and the propagation of change
- 지속적으로 데이터가 입력으로 들어올 수 있음을 의미, 데이터가 지속적으로 발생하는 것 자체를 데이터에 어떤 변경이 발생함을 의미, 이 변경을 이벤트로 간주하고, 이벤트가 발생할 때 마다 데이터를 계속해서 전달
- automatic propagation of the changed data flow
- 지속적으로 발생하는 데이터를 하나의 데이터 플로우로 보고 데이터를 자동으로 전달
✔ 리액티브 스트림즈 컴포넌트
- Publisher
public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
- 데이터 소스로부터 데이터를 내보내는 (emit) 역할
subscribe()
의 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할subscriber()
퍼블리셔가 내보내는 데이터를 수실할 지 여부를 경정하는 구독의 의미
메서드가 호출되지 않으면 퍼블리셔가 데이터를 내보내는 프로세스는 시작되지 않는다.
- Subscriber
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)
- 구독이 시작되는 시점에 호출, 퍼블리셔에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리
onNext(T t)
- 퍼블리셔가 데이터를 emit할 때 호출되며, emit된 데이터를 전달 받아서 소비할 수 있다.
- `onError(Throwable t)
- 퍼블리셔로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우 호출
onComplete()
- 퍼블리셔가 데이터를 emit 하는 과정이 종료될 경우 호출, 데이터의 emit이 정상적으로 완료된 후, 처리해야 될 작업이 있다면 메서드 내에서 수행 가능
- Subscription
public interface Subscription { public void request(long n); public void cancel(); }
- Subscriber의 구독 자체를 표현한 인터페이스
request(long n)
- 퍼블리셔가 emit하는 데이터의 개수를 요청
cancel()
- 구독을 해지하는 역할, 구독 해지가 발생하면 퍼블리셔는 더이상 데이터를 emit하지 않음.
- Processor
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
- Publisher와 Subcriber의 역할을 동시에 할 수 있는 특징.
Mono
- Publisher
데이터를 내보내는 주체를 의미 / 위 코드에서는 Flux가 퍼블리셔- Emit
퍼블리셔가 데이터를 내보내는 것- Subscriber
퍼블리셔가 emit한 데이터를 전달 받아서 소비하는 주체
- 위 코드에서는
System.out::println
가 Subscriber에 해당된다. 람다 표현식을 메서드 레퍼런스로 축약하지 않았다면 람다 표현식 자체가 해당됨.- Subscribe
구독을 의미 /subscribe()
메서드를 호출하면 구독을 하는 것- Signal
퍼블리셔가 발생시키는 이벤트를 의미
- 위 코드에서 subscribe() 메서드가 호출되면 퍼블리셔인 Flux는 숫자 데이터를 하나씩 하나씩 emit 한다.
이 때 숫자 데이터를 하나씩 emit 하는 자체를 리액티브 프로그래밍에서는 이벤트가 발생하는 것으로 간주 , 이 이벤트 발생을 다른 컴포넌트에게 전달하는 것을 Signal을 전송한다 라고 함.- Operator
어떤 동작을 수행하는 메서드를 의미
fromIterable(), filter(), reduce() 등 메서드 하나하나를 말함.- Sequence
Operator 체인으로 표현되는 데이터의 흐름을 의미
위 코드에서 Operator 체인으로 작성된 코드 자체를 하나의 시퀀스라고 이해하면 됨.- UpStream / DownStream
시퀀스 상의 특정 Operator를 기준으로 위쪽의 Sequence 일부를 Upstream, 아래쪽 시퀀스 일부를 Downstream이라고 표현한다.