ReactiveX 공식문서 읽어보기 2

김성환·2024년 4월 27일
post-thumbnail

이전글에서는 ReactiveX가 무었인지 어떤방식으로 비동기처리를 도와줄수있는지 확인하였습니다.
이번 포스팅에서는 ReactiveX에서 사용되는 Observable을 좀더 알아가보도록 합시다.
Observable이라고하면 스타크래프트이 옵저버가 생각납니다

비슷합니다. 스타크래프르에서 옵저버의 역할을 맵의 시야를 볼수있게 관찰하는 역할입니다.
ReactiveX에서는 옵저버가 Observable을 관찰합니다. 말그대로 Observable은 관찰할수있는것 입니다.


위이미지는 ReactiveX에서 제공하는 마블 다이어그램을 한글로 번역한것 입니다.
그림을 보면 Observable은 데이터를 넣을수 있으면 Observable안에 지정한 처리가있다면 해당 데이터들을 들어온후 Observable안에서 처리를 하게된후 데이터가 나오게됩니다. 이때 옵저버 즉 관찰자가 있다면 데이터를 받게되는것입니다.

공식문서에서는 ReactiveX에서는 많은 명령어가 병렬로 실행될 수 있으며 그 결과는 나중에 옵저버에 의해 임의의 순서로 캡처됩니다.메서드를 호출하는 대신 "Observable" 형식으로 데이터를 검색하고 변환하는 메커니즘을 정의한 다음 관찰자를 구독합니다. 정의된 메커니즘은 관찰자가 구독을 한시점에서 작업을 시작합니다. 이 접근 방식의 장점은 서로 의존하지 않는 여러 작업이 있는 경우 다음 작업을 시작하기 전에 각 작업이 완료될 때까지 기다리지 않고 동시에 모든 작업을 시작할 수 있다는 것.

일반적인 메서드 호출

  1. 메서드를 호출합니다.
  2. 해당 메서드의 반환 값을 변수에 저장합니다.
  3. 해당 변수와 새 값을 사용하여 유용한 작업을 수행하세요.
// make the call, assign its return value to `returnVal`
returnVal = someMethod(itsParameters);
// do something useful with returnVal

비동기식 모델에서 흐름

  1. 비동기 호출의 반환 값으로 유용한 작업을 수행하는 메서드를 정의합니다. 이 메서드는 관찰자 의 일부입니다 .
  2. 비동기 호출 자체를 Observable 로 정의하십시오 .
  3. Observable을 구독 하여 해당 Observable에 관찰자를 연결합니다 (이것은 또한 Observable의 작업을 시작합니다).
  4. 귀하의 사업을 계속하십시오. 호출이 반환될 때마다 관찰자의 메서드는 반환 값( Observable이 내보낸 항목) 에 대해 작동하기 시작합니다.
// defines, but does not invoke, the Subscriber's onNext handler
// (in this example, the observer is very simple and has only an onNext handler)
def myOnNext = { it -> do something useful with it };
// defines, but does not invoke, the Observable
def myObservable = someObservable(itsParameters);
// subscribes the Subscriber to the Observable, and invokes the Observable
myObservable.subscribe(myOnNext);
// go on about my business

onNext, onCompleted, and onError

def myOnNext = { item -> /* 항목으로 유용한 작업 수행 */ }; 
def myError = { throwable -> /* 실패한 호출에 현명하게 반응합니다 */ }; 
def myComplete = { /* 최종 응답 후 정리 */ }; 
def myObservable = someMethod(itsParameters); 
myObservable.subscribe(myOnNext, myError, myComplete); 
// 내 사업에 대해 계속

이런식으로 상화에맞는 메서드를 하위 집합으로 구현하여 넣으수도 있습니다.

옵저버의 구독을 취소할수도 있습니다. unsubscribe를 통해 구독을 취소할수 있으며 구독 취소의 결과는 관찰자가 구독한 Observable에 적용되는 연산자 체인을 통해 다시 계단식으로 전달되며 이로 인해 체인의 각 링크가 항목 방출을 중지하게 됩니다.

“Hot” and “Cold” Observables

Observable은 언제 항목 시퀀스를 방출하기 시작합니까? Observable에 따라 다릅니다. "Hot" Observable은 생성되자마자 항목을 방출하기 시작할 수 있으므로 나중에 해당 Observable을 구독하는 관찰자는 중간 어딘가에서 시퀀스를 관찰하기 시작할 수 있습니다. 반면에 "Cold" Observable은 항목을 방출하기 시작하기 전에 관찰자가 구독할 때까지 기다리므로 그러한 관찰자는 처음부터 전체 시퀀스를 볼 수 있습니다

ReactiveX의 일부 구현에는 "Connectable" Observable이라는 것이 있습니다. 이러한 Observable은 관찰자가 구독했는지 여부에 관계없이 Connect 메서드가 호출될 때까지 항목 방출을 시작하지 않습니다.

Observable과 Observer는 ReactiveX의 시작일 뿐입니다. 그 자체로는 표준 관찰자 패턴을 약간 확장한 것에 지나지 않으며 단일 콜백보다는 일련의 이벤트를 처리하는 데 더 적합합니다.

진정한 힘은 Observable이 내보낸 일련의 항목을 변환, 결합, 조작 및 작업할 수 있게 해주는 연산자인 "반응성 확장"과 함께 제공됩니다. Rx 연산자를 사용하면 콜백의 모든 효율성 이점을 활용하면서 일반적으로 비동기 시스템과 관련된 콜백 핸들러 중첩의 단점 없이 선언적 방식으로 비동기 시퀀스를 함께 구성할 수 있습니다.

대부분의 연산자는 Observable에서 작업하고 Observable을 반환합니다. 이를 통해 이러한 연산자를 체인으로 하나씩 적용할 수 있습니다. 체인의 각 연산자는 이전 연산자의 작업 결과로 생성된 Observable을 수정합니다.

특정 클래스의 다양한 메소드가 해당 메소드의 작동을 통해 해당 객체를 수정하여 동일한 클래스의 항목에 작동하는 빌더 패턴과 같은 다른 패턴도 있습니다. 또한 이러한 패턴을 사용하면 비슷한 방식으로 메서드를 연결할 수 있습니다. 그러나 빌더 패턴에서는 메소드가 체인에 나타나는 순서는 일반적으로 중요하지 않지만 Observable 연산자 순서는 중요합니다 .

Observable 연산자 체인은 체인을 시작하는 원래 Observable에서 독립적으로 작동하지 않지만 차례로 작동하며 각 연산자는 체인의 바로 이전 연산자에 의해 생성된 Observable에서 작동합니다


정리

Observable에 옵저버를 등록하여 해당 데이터를 받으수있을뿐만아니라 여러 상황에 맞는 콜백을 추가할수도있으면 이외에도 체인을 추가하여 여러 처리를 추가할수도있습니다. 또한 Observable안에서는 비동기적으로 처리되기때문에 여러 이벤트작업에 유용하게 사용할수 있음


reference
https://reactivex.io/documentation/observable.html

0개의 댓글