본문 바로가기
Rx

Observable -12 ( 뜨거운 Observable)

by 봄석 2018. 12. 23.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=



뜨거운 Observable

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


차가운 Observable은 마치 냉장고에 들어있는 냉동식품과 같습니다.Observable을 선언하고

just(), fromIterable() 함수를 호출해도 옵서버가 subscribe() 함수를 호출하여 구독 하지 않으면 데이터를 발행하지 않습니다.


뜨거운 Observable은 구독자가 존재 여부와 관계없이 데이터를 발행하는 Observable 입니다.

따라서 여러 구독자를 고려할 수 있습니다. 단, 구독자로서는 Observable에서 발행하는 모든 데이터를 처음부터 수신할 것으로 보장할 수 없습니다. 즉 차가운 Observable은 (구독자가) 구독하면 준비된 데이터를 처음부터 발행하고, 뜨거운 Observable은 구독한 시점부터 Observable에서 발행한 값을 받습니다.


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


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



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

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


기존 RxJava 1.x 에서는 Observable 클래스에 별도의 배압 연산자들을 제공했지만 RxJava 2에서는 Flowable이라는 특화 클래스에서 배압을 처리합니다. 


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







------------------------------------------------------------------------------------------------------


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

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


데이터 원천은 한 곳이지만 내가 최종적으로 원하는 결과 데이터가 여러 종류일 때는 각각을 구독자로 생각하면 좋습니다.

댓글