아직은 개린이

[RxSwift] Observable (1) 본문

Swift + iOS/RxSwift

[RxSwift] Observable (1)

jiyeonlab 2021. 10. 5. 22:50

Observable 이란?

ReactiveX에서 Observer는 Observable을 구독한다. Observable이 배출하는 하나 또는 연속된 항목에 Observer는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를 배출할 때까지 기다릴 필요 없이 어떤 객체가 배출되면 그 시점을 감시하는 관찰자를 옵저버 안에 두고 그 관찰자를 통해 배출 알림을 받으면 되기 때문이다.

 

ReactiveX 공식 문서에 나온 내용은 위와 같다.

이해한대로 끄적여보면.. Observable이라는 애(?)에서는 객체들이 배출되고, 배출된 객체들은 옵저버에 의해 캐치되어서 뭔가 다음 작업을 할 수 있다는 것인데... 뭔가 알듯 말듯 아리송한 느낌이다.

그러던 중 몇몇 블로그에서 쉽게 빗대어 놓은 예시를 발견했고, 해당 내용을 읽고 나니 좀 더 명확한 그림이 그려졌다! 

 

예시 1)

유튜브에 빗대면, 크리에이터가 Observable 역할을 하며 이벤트에 해당하는 영상들을 발행하면, 크리에이터를 구독하는 구독자(Observer)들이 영상을 시청/소비 하는 것과 비슷하다!

 

예시 2)

어떤 강(stream)이 있는데 이 강에는 물고기(value) 혹은 쓰레기(value)들이 흘러간다. 강에서 물고기만 건져 회를 뜰 수 있는 시스템을 만들었다고 가정해보자. 이 시스템은 사용자가 사용 버튼을 누를 시 가동된다. 여기서 강이 Observable에 해당한다. (Operator, Subscribe와 같은 개념은 추후에 좀 더 보충!)

 

즉, Observable은 관찰 가능한 데이터의 흐름이라고 이해하면 될 것 같다. Observer가 Observable을 구독하고, Observable이 방출하는 이벤트에 반응하는 것이 Rx의 가장 큰 핵심이다. 여기서 이벤트라는 것은 숫자 혹은 커스텀 타입의 인스턴스일 수도 있고, tap과 같은 액션일 수도 있고!

 

또한, Observable = sequence = observable sequence 모두 같은 의미로 사용된다고 하며, 옵저버 개념을 이해하며 더 배우겠지만 Observer가 관찰하는 대상이라고 할 수 있다.

 

Observable의 라이프사이클

Observable가 방출할 수 있는 3가지 이벤트를 마블 다이어그램과 함께 알아보자.

(마블 다이어그램에서 화살표는 상대적인 시간의 흐름, 원은 sequence event를 의미한다)

 

  1. next
    • 구성요소, 값을 방출하는 기능
    • Observer에게 데이터를 전달함
      next
  2. error 
    • 이벤트를 방출하다가 에러가 발생하면 error를 방출하고 stream을 종료
    • 다이어그램에서 error 이벤트는 X로 표시하고, Observable의 라이프사이클은 이곳에서 종료된다.
      error
  3. complete
    • 모든 next 이벤트가 성공적으로 종료되면 발생하는 이벤트
    • 다이어그램에서 complete는 vertical bar로 표시하고, error와 마찬가지로 Observable의 라이프사이클은 이곳에서 종료된다.

 

Observable은 element를 포함하는 next 이벤트를 방출하고, 이는 error 혹은 completed 등의 terminate 이벤트가 발생하기 전까지는 지속될 수 있다. Observable이 종료되면 더 이상 이벤트를 방출할 수 없다.

 

Hot Observable, Cold Observable

Observable에는 hot, cold 개념이 있다. 

  • Hot Observable은 구독 여부에 상관없이 이벤트를 발생시키고, 나중에 구독한 옵저버는 중간부터 시퀀스를 관찰할 수 있다고 한다. 유튜브 실시간 방송의 예시를 들어, 시청자(Observer)가 어느 시점에 방송을 보던 상관없이 방송은 진행되고, 시청자는 subscribe 하는 시점부터 방송을 볼 수 있는 것을 생각하면 될 것 같다.
  • Cold Observable은 옵저버가 구독하기 전까지는 아이템을 방출하지 않고 기다리며, 구독을 하면 시퀀스 전체를 볼 수 있다고 한다. VOD 시청에 빗대어, 어떤 시청자(Observer)이건 시청을 시작하면 처음부터 방송이 시작되는 것을 생각하면 된다.

 


 

Observable에 대한 큰 그림을 파악하는 것도 생각보다 쉽지 않았다. 그렇다보니.. Observable 자체만 글을 몇 개 더 써야할 것 같다.. ㅎㅎ

회사에서 안드로이드 개발자 분이랑 Rx 스터디를 진행하기로 해서 공부하고 있는데, 꽤나 재밌는 시간이 될 것 같다!!

 


참고자료

- https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift/v4.0/chapters/2-observables

- http://reactivex.io/documentation/ko/observable.html

- https://duwjdtn11.tistory.com/625(유튜브에 빗댄 예시 1 내용이 있던 블로그)

- https://axe-num1.tistory.com/22(강물에 빗댄 예시 2 내용이 있던 블로그)

'Swift + iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Subject  (0) 2021.10.11
[RxSwift] Observable (2)  (0) 2021.10.11
Reactive Programming, Rx  (0) 2021.10.03