Reactive Programing

Cold Observable vs Hot Observable (PublishSubject 클래스)

태인킴 2020. 11. 22. 00:01
반응형


Observable에는 [뜨거운 Observable(Hot Observable)][차가운 Observable(Cold Observable)]이 있습니다.

 

 

1. Cold Observable

[차가운 Observable]인 ObservableObservabled.just()  Observable.fromIterable() 함수를 호출해도 옵저버가 subscribe() 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않습니다. 

 

[차가운 Observable]은 다음과 같습니다.

- Observable

- Single

- Maybe

 

[차가운 Observable]의 예는 웹 요청, 데이터베이스 쿼리파일 읽기 등 입니다. 보통 내가 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스 서버에 요청을 보내고 결과를 받아옵니다.

 

[차가운 Observable]은 구독자가 구독하면 준비된 데이터를 처음부터 발행 합니다. 하지만, [뜨거운 Observable]구독한 시점부터 Observable에서 발행한 값을 받습니다.

 

 

2. Hot Observable

[뜨거운 Observable]구독자가 존재 여부와 관계없이 데이터를 발행하는 Observable 입니다. 따라서 여러 구독자를 고려할 수 있습니다. 단, 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신할 것을 보장할 수 없습니다.

 

[뜨거운 Observable]의 예는 마우스 이벤트, 키보드 이벤트, 시스템 이벤트, 센서 데이터와 주식 가격 등이 있습니다. 온도, 습도 센서의 데이터를 처리하는 앱이라면 최근의 온도, 습도 정보만 사용자에게 표시하면 됩니다.

 

[뜨거운 Observable]의 예로는 아래와 같습니다.

- AsyncSubject

- BehaviorSubject

- PublishSubject

- ReplaySubject

 

[뜨거운 Observable]에는 주의할 점이 있습니다. 배압(BackPressure)을 고려해야 합니다. 배압은 Observable에서 데이터를 발행하는 속도구독자가 처리하는 속도차이가 클 때 발생합니다. 

 

 

3. Subject 클래스

Subject 클래스차가운 Observable뜨거운 Observable로 바꿔줍니다. Subject 클래스의 특성은 Observable의 속성과 구독자의 속성이 모두 있습니다. Observable 처럼 데이터를 발행할 수도 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있습니다. 

 

 

4. PublishSubject 클래스

가장 일반적인 Subject 클래스 입니다. 구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작합니다. 오직 해당 시간에 발생한 데이터를 그대로 구독자에게 전달 받습니다.

PublishSubject 마블 다이어그램

 

5. PublishSubject  kotlin 소스

fun publishSubjectTest() {
    val subject = PublishSubject.create<String>()
    subject.subscribe{data -> println("subscribe 1 : ${data}")}
    subject.onNext("1")
    subject.onNext("3")
    subject.subscribe{data -> println("subscribe 2 : ${data}")}
    subject.onNext("5")
    subject.onCompleted()
}

출력 결과

publishSubjectTest() 출력 결과

첫번째 구독자subscribe() 함수를 호출하면서 구독을 합니다. 이후의 데이터 '1', '3' 이 발행 됩니다. 첫번째 구독자(subscribe 1)'1', '3' 을 배출 합니다. 그리고, 두번째 구독자(subscribe 2)가 구독 합니다. 그리고, 데이터 '5'가 입력 됩니다. (subscribe 1)과 (subscribe 2)는 데이터 '5' 를 발행 합니다.

반응형