본문 바로가기

프로그래밍/RxJava

(22)
[RxJava] ConnectableObservable 클래스 이전에 Observable의 수많은 변형을 다루었다. 주어진 데이터를 발행하기위해 just()나 fromArray() 함수를 사용할 때도 있었고 PublishSubject, AsyncSubject 클래스 등 처럼 Observable이면서 옵서버도 되는 Subject 클래스도 살펴봤다. 이번에 살펴볼 ConnectableObservable 클래스는 Subject 클래스처럼 차가운 Observable을 뜨거운 Observable로 변환한다. Observable을 여러 구독자에게 공유할 수 있으므로 원 데이터 하나를 여러 구독자에게 동시에 전달할 때 사용한다. 특이한 점은 subscribe() 함수를 호출해도 아무 동작이 일어나지 않는다는 점이다. 그럼 어떻게 발행해?? 바로 connect() 함수를 호출한 ..
[RxJava] 데이터 발행자와 수신자 지금까지 Observable을 살펴보면서 다양한 용어를 새롭게 배웠다. 처음 공부하기 때문에 좀 헷갈려서 간단한 기준으로 분류하려고한다. 크게 데이터를 발행하는 쪽과 데이터를 수신하는 쪽으로 나눌 수 있다. 데이터 발행자(data source) 데이터 수신자 Observable 구독자(Subscriber) Single 옵서버(Observer) Maybe 소비자(Consumer) Subject Completable 데이터 발행자는 클래스의 개념이기에 명확하게 구분된다. 하지만, 데이터 수신자는 몇 가지 용어를 번갈아 가면서 사용하므로 개념이 명확히 구분이 되지 않는다. 1. 구독자 - RxJava에서 Observable을 연결할 때는 subscribe() 함수를 호출한다. 이 과정이 구독이므로 구독자가 된..
[RxJava] Subject 클래스 - ReplaySubject 클래스 마지막으로 소개할 ReplaySubject 클래스는 가장 특이하고, 사용할 때 주의해야하는 클래스이다. Subject 클래스의 목적은 뜨거운 Observable을 활용하는 것인데, ReplaySubject 클래스는 차가운 Observable처럼 동작하기 때문이다. ReplaySubject 클래스는 구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장한다. 마치 테이프로 전체 내용을 녹음해두었다가 새로운 사람이 들어오면 정해진 음악을 처음부터 들려주는 것 처럼 말이다. 그렇기에 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 가능성을 염두해두고 사용할 때 주의해야한다. 아래그림은 ReplaySubject 마블 다이어그램이다. 첫번째 구독자가 subscribe() 함수를 호출하..
[RxJava] Subject 클래스 - PublishSubject 클래스 PublishSubject 클래스는 Subject 클래스 중 가장 평범한 클래스이다. 구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작한다. AsyncSubject 클래스처럼 마지막 값만 발행하거나 BehaviorSubject 클래스처럼 발행한 값이 없을 때 기본값을 대신 발행하지도 않는다. 오직 해당 시간에 발생한 데이터를 그대로 구독자에게 전달받는다. 아래 그림은 PublishSubject의 마블 다이어그램이다. 첫번째 구독자가 subscribe()를 하게 되면 '빨간색 원'과 '초록색 원' 데이터를 발행하게 된다. 두번째 구독자가 subscribe()를 하게 되면 '파란색 원' 데이터를 발행하게 되고 완료가된다. 즉, 첫번째 구독자는 Subject 클래스가 발행한 '빨간색 원', '..
[RxJava] Subject 클래스 - BehaviorSubject 클래스 이전 글에서 Subject 클래스의 기본과 AsyncSubject 클래스에 대해서 다뤘다. 이번 글에서는 BehaviorSubject 클래스에 대해서 알아보도록 하자. BehaviorSubject는 (구독자가) 구독을 하면 가장 최근 값 혹은 기본값을 넘겨주는 클래스이다. 예를 들어서, 온도 센서에서 값을 받아온다면 가장 최근 온도 값을 받아오는 동작을 구현할 수 있다. 또한 온도를 처음 얻을 때는 초깃값(예를 들어 0)을 반환하기도 한다. BehaviorSubject의 마블 다이어그램은 위와 같은 그림으로 표현된다. 여기서 '핑크색 원'은 BehaviorSubject 클래스를 생성할 때 넘긴 초깃값이 된다. 첫번째 구독자는 초깃값인 '핑크색 원'을 받고 다음에 '빨간색 원'부터 수신하게 된다. 두번째 ..
[RxJava] Subject 클래스 - AsyncSubject 클래스 Subject 클래스는 차가운 Observable을 뜨거운 Observable로 바꿔준다고 소개했다. Subject 클래스의 특성은 Observable의 속성과 구독자의 속성이 모두 있다는 점이다. 즉, Observable처럼 데이터를 발행할 수 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있다. RxJava에서 제공하는 주요 Subject 클래스에는 AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있다. AsyncSubject 클래스 AsysncSubject 클래스는 Observable에서 발행한 마지막 데이터를 얻어 올 수 있는 Subject 클래스이다. 완료되기 마지막 데이터 데이터에만 관심이 있으며, 이전 데이터들은 무시된다..
[RxJava] 뜨거운 Observable Observable에는 뜨거운 Observable(Hot Observable)과 차가운 Observable(Cold Observable)이 있다. 비유를 하자면, 차가운 Observable은 마치 냉장고에 있는 냉동식품과 같다. Observable을 선언하고 just(), fromIterable() 등 함수를 호출해도 옵서버가 subscribe() 함수를 호출하여 구독하지 않으면, 데이터를 발행하지 않는다. 다른 말로, 게으른(lazy) 접근법이다. 반면 뜨거운 Observable은 구독자가 존재 여부와 관계없이 데이터를 발행하는 Observable이다. 따라서 여러 구독자를 고려할 수 있다. 단, 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신할 것을 보장할 수는 없다. 즉, ..
[RxJava] Maybe 클래스 Maybe 클래스는 RxJava2에 처음 도입된 Observable의 또다른 특수 형태이다. Single 클래스와 마찬가지로, 최대 데이터 하나를 가질 수 있지만, 데이터 발행 없이 바로 데이터 발생을 완료할 수도 있다. 즉, (Single 클래스는 1개 완료, Maybe 클래스는 0 또는 1개 완료) Maybe 클래스는 Single 클래스에 onComplete 이벤트가 추가된 형태라고 생각하면 편할것이다. Maybe 객체는 Maybe 클래스를 이용하여 생성할 수 있지만 보통은 Observable의 특정 연산자를 통해서 생성할 때가 많다. 그리고, Maybe 객체를 생성할 수 있는 리액티브 연산자에는 elementAt(), firstElement(), flatMapMaybe(), lastElement()..