본문 바로가기
Rx

Observable -15 (Subject클래스-ReplaySubject클래스,데이터발행자와 수신자)

by 봄석 2018. 12. 23.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=



Subject 클래스

Subject 클래스는 차가운 Observable을 뜨거운 Observable로 바꿔주는 클래스입니다.

Subject 클래스의 특성은 Observable의 속성과 구독자의 속성이 모두 있다는 점입니다.

Observable 처럼 데이터를 발행할 수도 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있습니다.


RxJava에서 제공하는 주요 Subject 클래스에는 AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다.



Subject 클래스 중 ReplaySubject클래스

이 subject 클래스는 가장 특이하고 사용할 때 주의해야하는 ReplaySubject 클래스입니다.

Subject 클래스의 목적은 뜨거운 Observable을 활용하는 것인데 , 마치 차가운 Observable처럼 동작하기 때문입니다.


ReplaySubject 클래스는 구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장해 줍니다. 마치 테이프로 전체 내용을 녹음해 두었다가 새로운 사람이 들어오면 정해진 

음악을 처음부터 들려주는 것과 같습니다.


그러므로 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 가능성을 염두에 두고 사용할 때 주의해야 합니다.


ReplaySubject  클래스의 마블 다이어그램

 출처 - http://reactivex.io/RxJava/javadoc/io/reactivex/subjects/BehaviorSubject.html


ReplaySubject 클래스 활용 예
ReplaySubject<String> subject= ReplaySubject.create();
subject.subscribe(data->System.out.println("Subscriber #1 =>"+data ));
subject.onNext("1");
subject.onNext("3");
subject.subscribe(data->System.out.println("Subscriber #2 =>"+data ));
subject.onNext("5");
subject.onComplete();


ReplaySubject 클래스의 객체는 create()라는 정적 함수를 호출하여 생성합니다.

첫번째 구독자가 subscribe()함수를 호출하면 '1','3' 이라는 데이터를 발행합니다.

두번째 구독자가 subscribe()함수를 호출하면 마지막 데이터인 '5'를 발행하고 

onComplete()함수를 호출해 데이터 발행을 완료합니다.


실행결과는 아래와 같습니다.

Subscriber #1 =>1
Subscriber #1 =>3
Subscriber #2 =>1
Subscriber #2 =>3
Subscriber #1 =>5
Subscriber #2 =>5


첫번째 구독자는 Observable을 구독한 이후에 발행된 '1'과 '3'을 전달받습니다.

두번째 구독자는 subscribe()함수를 호출하면 지금까지 발행된 '1'과 '3'을 바로 전달받습니다.

마지막으로 Subject클래스가 '5'를 발행하면 두 구독자 모두 해당 값을 전달 받습니다.





--------------------------------------------------------------------------------------------------------데이터 발행자와 수신자

Observable은 크게 데이터를 발행하는 쪽과 데이터를 수신하는 쪽으로 분류할 수 있습니다.


 데이터발행자(data source)

데이터 수신자 


Observable

Single

Maybe

Subject

Completable


 구독자(Subscriber)

옵서버(Observer)

소비자(Consumer)


데이터 발행자는 클래스 개념이므로 명확하게 구분됩니다.그러나 데이터 수신자는 몇 가지 용어를 번갈아 사용하며 개념이 명확하게 구분되지 않습니다. 실제 RxJava 문서에서도 용어 하나로 통일 하지 않았습니다.


각 용어를 자세히 설명하면

1) 구독자 : RxJava에서 Observable과 연결할 때는 subscribe()함수를 호출합니다. 이과정이 구독이므로 구독자가 됩니다.


2) 옵서버 : RxJava는 옵서버 패턴을 구현합니다. 따라서 데이터 발신자는 Observable이 되고 데이터 수신자를 옵서버라고 할 수 있습니다.


3)  소비자 : RxJava 1.x에서는 subscribe()함수를 호출할 때 Subscriber 클래스를 인자로 넘겼지만, RxJava 2에서는 모두 함수형 인터페이스 인 Consumer를 인자로 넘깁니다. 이는 자바 8과 같은 이름을 사용하기 위해서 입니다.

댓글