뜨거운 Observable

2018. 12. 10. 18:47리액티브 프로그래밍/RxJava

Observable에는 뜨거운Observable (Hot Observable) 과 차가운 Observable(Cold Observable)이 있습니다.

차가운 Observable은 마치 냉장고에 들어있는 냉동식품과 같습니다. Observable을 선언하고 just(), fromIterable() 함수를 호출해도 옵저버가 subscribe() 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않습니다. 

다른말고 게으른 Lazy 접근법 임니다.


뜨거운 Observable은 구독자의 존재 여부와 관계없이 데이터를 발행하는 Observable입니다. 따라서 여러 구독자를 고려할 수 있습니다. 단, 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신할 것으로 보장할 수 없습니다.

즉, 차가운 Observable은 구독자가 구독하면(subscribe()) 준비된 데이터를 처음부터 발행합니다.  

하지만 뜨거운 Observable은 구독한 시점부터 Observable에서 발행한 값을 받습니다.


차가운 Observable의 예는 웹 요청, 데이터베이스 쿼리와 파일 읽기 등 입니다. 보통 내가 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스 서버에 요청을 보내고 결과를 받아옵니다.

지금까지 다뤄온 Observable은 모두 차가운 Observable입니다. 앞으로도 별다른 언급이 없을 경우에는 차가운 Observable이라고 생각하면 됩니다.


한편 뜨거운 Observable의 예는 마우스 이벤트, 키보드 이벤트, 시스템 이벤트, 센서 데이터 와 주식 가격 등이 있습니다. 온도, 습도 센서의 데이터를 처리하는 앱이라면 최근의 온도, 습도 정보만 사용자에게 표시하면 됩니다.

뜨거운 Observable에는 주의할 점이 있습니다. 바로 배압(back pressure)을 고려해야 한다는 점 입니다.

배압은 Observable에서 데이터를 발행하는 속도와 구독자가 처리하는 속도의 차이가 클 때 발생합니다.


차가운 Observable을 뜨거운 Observable 객체로 변환하는 방법은 Subject 객체를 만들거나 ConnectableObservable 클래스를 활용하는 것입니다.



구독자가 여러명이라는 것은 무슨 의미일까 ?

RxJava 에서 "구독자가 여러 명이다" 라는 뜻을 제대로 파악하는 것을 어렵게 느낄수 있습니다. 그런데 생각해보면 그다지 어렵지 않습니다. 예를 들어 서버에 요청한 결과로 반환된 JSON 문서를 파싱해 원하는 속성을 추출한다고 해봅시다. 날씨정보, 지역 정보, 시간 정보를 반환하는 경우 RxJava에서는 위의 세가지 정보를 구독자라고 생각하면 편리합니다.

데이터의 원천은 한 곳이지만 내가 최종적으로 우너하는 결과 데이터가 여러 종류일 때는 각각을 구독자로 생가갛면 좋습니다. 자세한 내용은 이 책의 다른 예제를 통해 설명하겠습니다.


RxJava에서 제공하는 주요 Subject 클래스에는 Async Subject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다. 각 클래스에는 어떤 특징이 있는지 다음 글에서 알아보겠습니다.