본문 바로가기

프로그래밍/RxJava

[RxJava] Subject 클래스

- 구독과 해지
: Observable 을 subscribe() 하여 구독하고 dispose() 하여 구독을 해지한다. 
Observable 이 complete() 를 보냈을때 dispose() 를 호출해 자동으로 구독 관계를 끊는다. 

- 차가운 Observable
: 차가운 Observable 은 subscribe() 함수를 호출하여 구독하지 않는 이상 데이터를 발행하지 않는다.
subscribe() 호출 즉시 준비된 데이터를 처음부터 발행한다.

- 뜨거운 Observable
: 구독자 존재 여부와 관계없이 데이터를 발행한다. 또 여러 구독자가 있을 수 있다. 단, 구독자가 Observable 에서 발행하는 데이터를 처음부터 수신하는 것을 보장하지 않고, subscribe() 시점부터 그 이후에 발행한 값을 받는다. 


Subject 클래스
- Subject 클래스는 차가운 Observable 을 뜨거운 Observable 로 바꿔준다. 
- Observable 처럼 데이터를 발행할 수도 있고, Subscriber 처럼 발행된 데이터를 바로 처리할 수도 있다.

* Subject 의 종류
- AsyncSubject 
Observable 에서 발행한 마지막 데이터를 전달받는 Subject 이다.
완료되기 전 마지막 데이터에만 관심이 있으며 이전 데이터는 무시한다. 
완료되기 전까지는 subscriber 에게 데이터를 전달하지 않다가 완료됨과 동시에 구독자에게 마지막 데이터를 발행하고 종료한다. 

onComplete() 을 호출한 이후에 subscribe() 한 경우에도 완료전 마지막 데이터를 가져온다. 

- BehaviorSubject 

BehaviorSubject 는 생성시 default 값을 설정한다.

구독자가 subscribe() 하면 가장 최근 값이나 기본 값을 넘겨주는 Subject 이다. 
구독 시점에 기본 값 또는 최근 값을 전달하고, 그 이후에 데이터를 구독자에게 전달한다. 

- PublishSubject 
가장 평범한 Subject 클래스로 구독자가 subscribe() 함수를 호출하면 subscribe() 이후에 발생한 데이터를 구독자에게 전달한다. 

- ReplaySubject 
구독자가 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장해주는 Subject 이다. 
다만, 모든 데이터를 저장해두는 과정에서 메모리 누수가 발생할 가능성이 있다.