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/ 이곳이 정리가 정말 잘되어있다. 뒤에 이어질 글은 이블로그 내용을 다시한 번 풀어쓴 것이다.
방출하는 값을 구독자들이 공유하는 특성탓에 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/
'Flutter' 카테고리의 다른 글
Flutter 화면전환에서 routes 와 onGenerateRoute 의 차이 (0) | 2024.06.04 |
---|---|
데이터 바인딩과 Reactive X (0) | 2024.06.03 |
Stateless Widget 에 const를 붙여야하는 이유 (0) | 2024.05.30 |
flutter_localization depends on flutter_localizations from sdk which depends on intl 0.18.1 에러 (2) | 2024.05.30 |
Sliver 에 대해 알아보자 (0) | 2024.05.30 |