관리 메뉴

나만을 위한 블로그

[Rxjava] Observable이란? - 1 - 본문

개인 공부/Rxjava

[Rxjava] Observable이란? - 1 -

참깨빵위에참깨빵 2021. 5. 26. 11:00
728x90
반응형

이제 코틀린과 같이 Rxjava를 공부할 건데, 어디서부터 공부할지가 막막해서 구글을 돌아다니다가 발견한 아래와 같은 순서로 한번 시도해보려고 한다.

https://zzandoli.tistory.com/24

 

[RxJava] RxJava 학습 순서

RxJava의 javadoc 문서를 보아도 글로 된 함수의 설명만으로는 이 함수가 무슨 동작을 하는지 이해하기 어렵다. 지금 공부하는 책에서 학습 순서를 제시하고 있는데 아래와 같이 학습 순서를 따라가

zzandoli.tistory.com

  1. Observable 클래스 이해하기(특히 Hot Observable, Cold Observable 개념 이해)
  2. map(), filter(), reduce(), flatMap()의 사용법 이해 (예제 분석 필요)
  3. 생성 연산자, 결합 연산자, 변환 연산자 등 카테고리 별 주요 함수 이해
  4. 스케줄러 의미 이해, subscribeOn()과 observeOn()의 차이 이해
  5. 기타 디버깅, 흐름 제어 함수 이해

Observable을 선언하는 것으로 시작하기 때문에 최우선적으로 Observable에 대한 이해가 필요할 것 같았다. 그리고 hot, cold가 각각 붙은 Observable도 있는데 이 둘의 차이가 무엇인지도 모르기 때문에 Observable을 먼저 파고들기로 했다.

 

먼저 Observable의 뜻부터 확인해보자.

Observable : 식별(관찰)할 수 있는
Observe : ~을 보다(보고 알다, 목격하다) / 관찰, 관측, 주시하다

어떤 것을 보고 있는 무언가란 뜻이 있을 것 같다. Rxjava 공식 홈페이지에선 Observable을 아래와 같이 말하고 있다.

http://reactivex.io/documentation/ko/observable.html

 

ReactiveX - Observable

Observable ReactiveX에서 옵저버는 Observable을 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를

reactivex.io

Rxjava에서 옵저버는 Observable을 구독한다. 옵저버는 Observable이 배출하는 하나 또는 연속된 항목에 반응한다. 이런 패턴은 동시성 연산을 가능하게 한다. 왜냐면 Observable이 객체를 배출할 때까지 기다릴 필요 없이 어떤 객체가 배출되면 그 시점을 감시하는 관찰자를 옵저버 안에 두고, 그 관찰자를 통해 배출 알림을 받으면 되기 때문이다...(중략)...ReactiveX에선 옵저버에 의해 임의의 순서에 따라 병렬로 실행되고 결과는 나중에 연산된다. 즉 메서드 호출보다는 Observable 안에 데이터를 조회, 변환하는 메커니즘을 정의한 후, Observable이 이벤트를 발생시키면 옵저버의 관찰자가 그 순간을 감지하고 준비된 연산을 실행시켜 결과를 리턴하는 메커니즘 때문에 Observable을 구독한다고 표현하는 것이 올바를 것이다...(중략)

공식 홈페이지 설명대로라면, 이벤트 발생 직후 어떤 처리로 결과를 리턴하기 위해 데이터를 조작하는 메커니즘을 정의하는 곳이 Observable인 것 같다.

그래서 결국 Observable이 뭐지? 좀 더 찾아봤다.

 

https://selfish-developer.com/entry/RxJava-Observable-Observer

 

RxJava - Observable, Observer

좀더 리액티브한(reactive) UI를 만들기 위해서 프로젝트에 RxJava, RxAndroid를 도입하면서 가장 어려웠던 점은 Observable과 Observer 클래스를 개념적으로 이해하는 것이었다. 옵저버 패턴을 응용한 라

selfish-developer.com

이 클래스(Observable)에 포함된 함수는 매우 다양하나 어떤 데이터를 관찰할 수 있는 형태로 바꾸는 것이 이 클래스의 기본적인 임무다. Observable의 의미인 '관찰할 수 있는'을 생각해보면 이 클래스가 어떤 일을 해야 하는지 짐작할 수 있다. 이 클래스는 개념적으로는 어떤 데이터를 옵저버가 처리할 수 있도록 포장하는 작업을 담당한다고 보면 이해하기엔 편하다. 추가적으로 값을 변형시키고 다른 타입으로 바꾸기도 하고...(중략)

위의 공식 홈페이지 설명에서 데이터를 조작하는 메커니즘을 정의하는 곳이 Observable이라고 생각했었다.

내가 놓친 것이 왜 그런 메커니즘을 정의하냐는 것이었다. 그 이유는 옵저버가 데이터를 바꾸는 등의 조작을 할 수 있도록 데이터를 관찰할 수 있는 형태로 만들어야 하기 때문이었다. 조금 Observable이 뭔지 이해가 되는 것 같기도 하다.

 

https://www.journaldev.com/22594/rxjava-observables-observers

 

RxJava Observables and Observers - JournalDev

In this tutorials, we'll be discussing RxJava Observables and Observers in length. We'll discuss their various types and what each of them has to offer.

www.journaldev.com

Rxjava에서 Observable은 옵저버에게 아이템을 내보내는(emit) 소스다. 옵저버가 Observable을 들으려면(listen) 먼저 구독해야(subscribe) 한다. Rxjava에서 구독한 후 생성된 인스턴스를 Disposable이라고 한다. Observable 수신을 중지하려면 Disposable 인스턴스에서 dispose()를 호출해 구독 취소를 호출할 수 있다.

Rxjava는 옵저버 패턴을 따르기 때문에 subscribe 같은 말이 등장하는 것 같다. 이 글에서도 결국 Observable은 옵저버에게 데이터를 전달하는 것이라고 보고 있다.

 

https://blog.mindorks.com/understanding-types-of-observables-in-rxjava-6c3a2d0819c8

 

Understanding Types Of Observables In RxJava

In this blog, we are going to learn the types of Observables in RxJava. Observable, Flowable, Single, Maybe, Completable. Then, we can use these types of observables in RxJava correctly.

blog.mindorks.com

Observable은 값을 방출하는 스피커와 같다. 일부 작업을 수행하고 일부 값을 내보낸다. 연산자(Operator)는 한 형식에서 다른 형식으로 데이터를 변환, 수정하는 번역기와 같다. 옵저버는 그 값을 얻는다.

 

스피커와 청자의 관계를 예시로 설명하는데 이 설명이 꽤 괜찮은 것 같다. 스피커(Observable)가 사람이 들을 수 있도록 소리를 가공하고, 필요하다면 데이터를 가공해서 청자(Observer)에게 전달한다는 흐름을 그림으로 보니 좀 더 이해가 잘 되는 것 같지만 아직 부족하다.

아래 글은 영화관을 예시로 들면서 Observable에 대해 설명하고 있다.

 

https://medium.com/mindorks/rxjava-types-of-observables-404d75605e35

 

RxJava — Types of Observables

Understanding RxJava for Android Development is like one of the most important things for an Android Developer.

medium.com

영화를 보러 가면 뭘 하는가? 팝콘을 들고 지정석에 앉아 영화가 시작되길 기다린다. 영화가 시작되면 우리의 즐거움은 영화의 맥락, 상영의 음질 등 몇 가지 요인에 따라 달라진다. 여기서 화면의 영화는 비디오를 내보내고, 상영관은 오디오로 작동하며, 품질 경험으로 그것을 향상시키고 우리는 각각 동기화된 오디오와 비디오를 수신한다(receive). 여기서 영화는 Observable이고 상영관은 Operator, 관객은 Observers다.

이해가 될 듯 하면서 안된다. 영화를 데이터라 치면 데이터를 내보내는 건 Observable이니까 영화를 Observable이라 한 것 같은데 그 뒤부터는 잘 모르겠다.

아무튼 지금까지 확인한 내용들 중 Observable이란 데이터를 내보내는 역할을 하는 클래스라는 것이다. 그런데 Observable은 2가지 종류가 있다. hot observable, cold observable이다.

각각의 차이가 뭔지 확인해보자.

 

https://taehyungk.github.io/posts/android-RxJava2-Cold-Hot-Observable-and-Subject/

 

[RxJava2] Cold Observable과 Hot Observable, 그리고 Subject

Hot Observable VS Cold Observable

taehyungk.github.io

Hot Observable은 뜨거워서 데이터를 바로 흘려 보내는 Observable이고, Cold Observable은 얼어붙어 있어서 subscribe를 해야 흘려 보내는 Observable이다.
Hot Observable은 Observable을 만들자마자 아이템들을 흘려보낸다는 의미다. 그래서 Observable을 만들고 일정 시간이 지난 상태에서 subscribe하게 된다면, 처음부터 아이템을 받아보지는 못하고 중간부터 나온 아이템을 subscribe할 수 있게 된다.
Hot Observable을 정리하면
1. 구독자의 존재 여부와 상관없이 데이터를 배출하는 Observable이다
2. 그래서 여러 구독자에 선택적으로 고려가 가능하다
3. 구독 시점으로부터 발행하는 값을 받는 걸 기본으로 한다
4. 마우스, 키보드, 시스템 이벤트 등이 주로 사용되며 멀티태스킹도 포함된다
Cold Observable은 반대로 바로 흘려보내지 않는다. subscribe할 때 아이템들을 흘려보낸다.
Cold Observable을 정리하면
1. 일반적인 옵저버 형태다
2. 누가 구독해주지 않으면 데이터를 배출하지 않는다
3. 일반적인 웹 요청, DB 쿼리 등이 사용되며 내가 요청하면 결과를 받는 과정을 거친다
4. 처음부터 발행하는 것을 원칙으로 한다

https://blog.yena.io/studynote/2020/11/08/Android-RxJava(3).html 

 

[Android] RxJava Cold Observable, Hot Observable

RxJava 1 포스트 [Android] RxJava 시작하기에서는 반응형 프로그래밍에 대한 개념을 설명하고 명령형 프로그램과의 차이를 서술했다. RxJava 2 포스트 [Android] RxJava Observable 옵저버블에서는 옵저버블과

blog.yena.io

Hot Observable : 라이브 방송을 시청하는 것처럼 아이템 발행이 시작된 이후로 모든 구독자에게 동시에 같은 아이템을 발행한다
Cold Observable : 유튜브 영상을 재생하는 것처럼 구독을 요청하면 아이템을 발행하기 시작한다

Cold Observable은 Observable에 구독을 요청하면 아이템을 발행하기 시작한다. 아이템은 처음부터 끝까지 발행되고, 임의로 종료시키지 않는 이상 여러 번 요청해도 처음부터 끝까지 발행하는 것을 보장한다. 생성된 Observable은 방출된 아이템에 대해 각각 고유한 인스턴스를 갖게 된다...(중략)...반면 Hot Observable은 아이템 발행이 시작된 이후로 모든 구독자에게 동시에 같은 아이템을 발행한다. 첫 번째 구독자가 Observable을 구독한 몇 초 뒤에 두 번째 구독자가 같은 Observable을 구독한다면, 둘은 동시에 같은 아이템을 수신하며 두 번째 구독자는 구독 이전에 발행된 아이템을 놓칠 수도 있다.
가장 일반적인 예시로는 안드로이드의 UI 이벤트다. 안드로이드의 클릭 이벤트는 observer가 구독한 후 이벤트만 수신하는 용도로만 사용되며, 이를 재생(replay)하기 위해 캐싱할 필요는 없다.

 

https://stackoverflow.com/questions/2521277/what-are-the-hot-and-cold-observables

 

What are the Hot and Cold observables?

I watched the video and I know the general principles - hot happens even when nobody is subscribed, cold happens "on demand". Also, Publish() converts cold to hot and Defer() converts hot to cold. ...

stackoverflow.com

Observable의 유형은 Hot, Cold 2개가 있다. 둘의 주요 차이점은 Cold Observable은 각 구독자에 대한 데이터 생산자를 생성하는 반면, Hot Observable은 먼저 데이터 생산자를 생성하고 각 구독자는 구독한 순간부터 한 생산자한테서 데이터를 가져온다. 넷플릭스에서 영화를 보는 것과 영화관에 가는 것을 비교해 보겠다. 자신을 관찰자(Observer)라고 생각하라.
넷플릭스에서 미션 임파서블을 보기로 결정한 사람은 언제 재생 버튼을 누르든 상관없이 전체 영화를 볼 수 있다. 넷플릭스는 나만을 위한 영화 스트리밍을 위해 새로운 제작자(producer)를 만든다. 이것이 Cold Observable이다.
영화관에 갈 것이고 상영 시간이 4시라면 제작자는 4시에 생성되고 스트리밍이 시작된다. 일부 사람들(Subscriber)이 늦게 오면 영화의 시작 부분을 놓치고 도착한 순간부터만 볼 수 있다. 이것이 Hot Observable이다.
Cold Observable은 일부 코드가 subscribe()를 호출할 때 데이터 생성을 시작한다. 예를 들어 앱은 특정 제품을 얻기 위해 서버에 URL을 제공하는 Observable을 선언할 수 있다. 구독 신청 시에만 요청이 이뤄진다. 다른 스크립트가 서버에 동일한 요청을 하면 동일한 데이터 집합을 가져온다.
Hot Observable은 구독자가 데이터에 관심없는 경우에도 데이터를 생성한다. 예를 들어 스마트폰의 가속도계는 이 데이터를 구독하는 앱이 없더라도, 장치의 위치에 대한 데이터를 생성한다. 사용자가 주식에 관심이 없는 경우에도 서버는 최신 주가를 생성할 수 있다.

내용들을 정리하면 아래의 표와 같이 될 것이다.

다음 포스팅에선 이 Observable과 관련된 예제들을 확인해 본다.

이름 특징
Hot Observable 아이템 발행이 시작된 후 모든 구독자에게 동시에 같은 아이템을 발행한다
즉, 데이터 생산자가 먼저 생성되고 구독자는 구독한 그 순간부터 생산자한테서 데이터를 받아온다
(영화 상영 시 중간에 입장해서 영화를 중간부터 보는 것)
Cold Observable 구독한 순간부터 처음부터 끝까지 모든 데이터를 받아볼 수 있음을 보장한다
여러 번 요청해도 처음부터 끝까지 발행한다. 단, 종료되는 경우 이를 보장할 수 없다
(넷플릭스에서 재생 버튼을 누르면 언제든 처음부터 끝까지 영상을 볼 수 있는 것)

 

반응형
Comments