Observable에는 뜨거운 Observable(Hot Observable)과 차가운 Observable(Cold Observable)이 있다.
비유를 하자면, 차가운 Observable은 마치 냉장고에 있는 냉동식품과 같다.
Observable을 선언하고 just(), fromIterable() 등 함수를 호출해도
옵서버가 subscribe() 함수를 호출하여 구독하지 않으면, 데이터를 발행하지 않는다.
다른 말로, 게으른(lazy) 접근법이다.
반면 뜨거운 Observable은 구독자가 존재 여부와 관계없이 데이터를 발행하는 Observable이다.
따라서 여러 구독자를 고려할 수 있다.
단, 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신할 것을 보장할 수는 없다.
즉, 차가운 Observable은 (구독자가) 구독하면 준비된 데이터를 처음부터 발행한다.
하지만, 뜨거운 Observable은 구독시점부터 Observable에서 발행한 값을 받는다.
차가운 Observalbe의 예는 웹 요청, 데이터베이스 쿼리와 파일 읽기 등이다.
보통 내가 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스 서버에 요청을 보내고 결과를 받아온다.
한편, 뜨거운 Observable의 예는 마우스 이벤트, 키보드 이벤트, 시스템 이벤트, 센서 데이터와 주식 가격 등이 있다.
예를 들어서, 온도, 습도 센서의 데이터를 처리하는 앱이라면 최근의 온도, 습도 정보만 사용자에게 표시하면된다.
*note 구독자가 여러 명이라는 것은 무슨 의미인가?
예를 들어 서버에 요청한 결과로 반환된 JSON 문서를 파싱해 원하는 속성을 추출한다고 하자.
날씨 정보, 지역 정보, 시간 정보를 반환하는 경우 RxJava에서는 위의 세 가지 정보를 구독자라고 생각하면 편하다.
데이터의 원천을 한곳이지만 내가 최종적으로 원하는 결과 데이터가 여러 종류일 때는 각각을 구독자로 생각하면 좋다.
*뜨거운 Observable에는 주의할 점이 있다.
배압을 고려야한다.
즉, 배압은 Observable에서 데이터를 발행하는 속도와 구독자가 처리하는 속도의 차이가 클 때 발생한다.
기존, RxJava 1.x에서는 Observable 클래스에서 별도의 배압 연산자들을 제공했지만,
RxJava2.x에서는 Flowable이라는 특화 클래스에서 배압을 처리한다.
자세한 내용은 추후에 다루도록 하고 이런게 있다고 이해하고 넘어가도록 하자.
차가운 Observable을 뜨거운 Observable 객체로 변환하는 방법은
Subject 객체를 만들거나, ConnectableObservable 클래스를 활용하는 것이다.
이 부분에 대해서는 다음 내용에서 더 자세히 설명하도록 하겠다.
'프로그래밍 > RxJava' 카테고리의 다른 글
[RxJava] Subject 클래스 - BehaviorSubject 클래스 (0) | 2020.02.25 |
---|---|
[RxJava] Subject 클래스 - AsyncSubject 클래스 (0) | 2020.02.20 |
[RxJava] Maybe 클래스 (0) | 2020.02.17 |
[RxJava] Single - just() 함수와 Observable에서 Single 클래스를 사용하는 다양한 방법 (0) | 2020.02.17 |
[RxJava] Single 클래스 (0) | 2020.02.16 |