Flutter

Hot Observable & Cold Observable

flutter developer 2024. 6. 1. 17:14

 

Rx를 실제 사용한다고 생각해보자. Rx를 사용할 때 순서를 생각해보면 아래와 같이 크게 3가지 과정을 거칠것이다.

 

1. 먼저 Observable을 만든다.

2. 원하는 연산자를 사용한다.

3. 구독해서 사용한다.

 

그렇다면 위에서 반드시 만나는 문제는 어떤 Observable 과 Operator 를 사용할 것이냐이다. 이때 알아야할 지식이 바로 Hot Observable & Cold Observable 개념이다. 두 옵저버블의 특성을 알아보고 실전에서 어떻게 쓰이는지 살펴보자

 

Unicast vs Muticast

먼저 Observable에는 개별적으로 스트림을 던지는 녀석과 던지는 스트림을 공유하는 녀석이 있다. 전자를  Unicast로, 후자인 multicast라고 부르며 Unicast 를 하는 대표적인 예로는 기본 Observable, Multicast 의 대표적인 예는 Subject가 있다.

 

 

구독자 유무

Cold Observable은 누군가 구독을 하기 전까지 값을 방출하지 않는다. 값을 방출할 때도 유니캐스트 방식으로 나가게 된다. 반면 Hot Observable은 값 방출을 구독자 없이도 하며 누군가 구독하게 된다면 멀티캐스트 방식으로 값을 방출하게 된다. 그래서 이러한 특성이 함의하는 무엇일까? 

 

Observable 이어붙이기

설명하기 앞서 https://tech.lonpeach.com/2019/09/29/UniRx-Hot-Cold/  이곳이 정리가 정말 잘되어있다. 뒤에 이어질 글은 이블로그 내용을 다시한 번 풀어쓴 것이다.

 

https://tech.lonpeach.com/2019/09/29/UniRx-Hot-Cold/

방출하는 값을 구독자들이 공유하는 특성탓에 Hot Observable은 여러 Observable들로 분기처리를 해줄 수 있다.  

 

 

반면 Cold Observable은 분기처리를 하게되면 새로운 별도의 스트림이 생성된다.따라서  별도의 스트림 처리가 필요한 경우 (특히 I/O 작업!) 에는 Cold 옵저버블로 끝맺음지어서 이를 구독하게 해야한다.

 

만약 값을 방출하는 시기의 타이밍이나 전후관계가 중요한 경우에 콜드 옵저버블 뒤에 반드시 구독 or hot 이 와야지, 콜드가 오면 또다른 새로운 스트림이 생기면서 타이밍과 전후관계 보장이 안된다. 

 

정리

  • Cold: 스트림의 전후를 연결하는 파이프. 단독으로는 의미가 없다. 대부분의 오퍼레이터는 Cold이다.
  • Hot: 스트림에서 값을 계속 발행하는 수도꼭지. 항상 흐린다. 뒤에 파이프를 많이 연결 할 수 있다.

Rx를 사용할 때 스트림이 어디에서 분기를 해야하는가를 항상 의식하고 설계하는 것이 중요하다고 한다. 특히 블로그 가장 마지막에 

 

"클래스 외에 Observable을 공개 할 때는 Cold인 채로 공개하지 말고, 반드시 말단에서 Hot으로 변환한 후 공개한다"

 

는 Rx를 활용할 때 꼭 기억해두어야할 부분인 것 같다.


https://youtu.be/dWgpLoD1cCE?si=YSYPVn5M4MIWNANi

https://tech.lonpeach.com/2019/09/29/UniRx-Hot-Cold/

 

Rx의 Hot과 Cold 대해 | Lonpeach Tech

환경

tech.lonpeach.com