최데브는 오늘도 프로그래밍을 한다.

RxJava - Hot Observable , Cold Observable 본문

Android/RxJava, RxKotlin

RxJava - Hot Observable , Cold Observable

최데브 2021. 10. 20. 14:34

이전에 쓴 글(아래 링크 참고) 에서 뒷쪽에

https://choi-dev.tistory.com/107?category=972011 

 

RxJava - Observable을 제외한 다른 생산자들

전 포스팅에서는 Observable에 대해서 알아봤다. 기본적인 생산자였는데 Observable 0개에서 n개의 데이터를 전달하는 생산자다. 기본적인 생산자로 단건(0 or 1)이 아니면 대부분 Observable을 쓴다. observe

choi-dev.tistory.com

Subject 에 대한 이야기가 나온다. 

그때는 간단하게 설명하고 지나갔는데 공부하던중 추가로 알게 된 내용이 있어서 포스팅한다.

먼저 이 이야기를 시작하려면 제목의 Hot Observable , Cold Observable 에 대해서 알고 넘어가야한다.

(사실 이 이야기가 이 글의 핵심인건 맞다.)

 

 Cold Observable

  • Observable을 선언하고 just() 함수를 호출해도 옵서버가 subscribe() 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않는다. ==> 게으른 접근법
    • 예시) 웹 요청, 데이터베이스 쿼리와 읽기 등 / 내가 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스에 요청을 보내고 결과를 받아옴
  • 구독자가 구독하면 준비된 데이터를 처음부터 발행.
  • retrofit2 과 연동해서 사용해서 http 통신으로 데이터를 받아왔을때도 보통 이런 상황이다.

 

Hot Observable

    • 구독자가 존재 여부와 관계없이 데이터를 발행함. => 여러 구독자를 고려할 수 있다.
    • 단, 구독자로서는 Observable에서 발행하는 데이터를 모두 수신할 것으로 보장할 수 없다.
    • 구독한 시점부터 Observable에서 발행한 값을 받는다.
      • 예시) 마우스 이벤트, 키보드 이벤트, 시스템 이벤트, 센서 데이터, 주식 가격
    • 주의할점 ) 배압을 고려해야 함.
      • 배압은 Observable에서 데이터를 발행하는 속도와 구독자가 처리하는 속도의 차이가 클 때 발생
      • Flowable이라는 특화 클래스에서 배압을 처리
    • 안드로이드를 예를 들면 브로드캐스트 메시지를 글로벌하게 전송한다고 생각을 하면 된다. 만약에 첫번째 구독자가 Observable을 구독하고, 몇 초 뒤에 두 번째 구독자가 똑같은 Observable을 구독한다고 가정하면 이 둘은 같은 아이템을 동시에 수신을 하지만, 두 번째 구독자는 구독하기 전에 발행된 아이템을 놓칠 수도 있다.

Cold -> Hot 으로는 변경이 가능한데 이를 가능하게 하는게 Subject 클래스다.

사실 변경을 시켜주는거라고 하기보단 둘다 될 수 있다는 표현이 더 적당한 것 같다.

 

 

 

 

 

반응형
Comments