마지막으로 소개할 ReplaySubject 클래스는 가장 특이하고, 사용할 때 주의해야하는 클래스이다.
Subject 클래스의 목적은 뜨거운 Observable을 활용하는 것인데,
ReplaySubject 클래스는 차가운 Observable처럼 동작하기 때문이다.
ReplaySubject 클래스는 구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장한다.
마치 테이프로 전체 내용을 녹음해두었다가
새로운 사람이 들어오면 정해진 음악을 처음부터 들려주는 것 처럼 말이다.
그렇기에 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 가능성을 염두해두고
사용할 때 주의해야한다.
아래그림은 ReplaySubject 마블 다이어그램이다.
첫번째 구독자가 subscribe() 함수를 호출하면 '빨간 원', '초록 원'이 발행된다.
두번째 구독자가 subscribe() 함수를 호출하면 그 전에 발행했던 '빨간 원', '초록 원'이 발행되고,
나중에 발행한 '파란 원'을 두 구독자 모두 발행하면서 완료된다.
즉, 모든 구독자가 모든 데이터 발행이되고 완료되는 것이다.
위와 같은 구조를 아래와 같은 소스 코드로 구현할 수 있다.
public void marbleDiagram(){
ReplaySubject<String> subject = ReplaySubject.create();
subject.subscribe(data -> System.out.println("Subscriber #1 => " + data ));
subject.onNext("red");
subject.onNext("green");
subject.subscribe(data -> System.out.println("Subscriber #2 => " + data ));
subject.onNext("blue");
subject.onComplete();
}
[결과값]
Subscriber #1 => red
Subscriber #1 => green
Subscriber #2 => red
Subscriber #2 => green
Subscriber #1 => blue
Subscriber #2 => blue
'프로그래밍 > RxJava' 카테고리의 다른 글
[RxJava] ConnectableObservable 클래스 (0) | 2020.02.25 |
---|---|
[RxJava] 데이터 발행자와 수신자 (0) | 2020.02.25 |
[RxJava] Subject 클래스 - PublishSubject 클래스 (0) | 2020.02.25 |
[RxJava] Subject 클래스 - BehaviorSubject 클래스 (0) | 2020.02.25 |
[RxJava] Subject 클래스 - AsyncSubject 클래스 (0) | 2020.02.20 |