brunch

You can make anything
by writing

C.S.Lewis

[RxJava]#7 뜨거운/차가운 Observable

들어가는 글: 오랫만에 뵙습니다. 6화를 올릴 때가 작년 9월25일이었으니 정확하게 9개월이 지났네요. 시간은 참 빠른거 같아요. 그동안 많은 분들이 읽어주셔서 구글에 "rxjava"로 검색하면 첫 화면에 등장하는 영광을 누리게 되었네요 ㅋ 이제부터 남은 이야기 보따리를 풀도록 하겠습니다. 


1. 지난 9개월간 무엇을 했나? 


"rxjava"로 검색하면 브런치 글이 나옵니다 :-) 


RxJava에 관하여 1화에서 6화까지 올리는데는 채 2주가 걸리지 않았습니다. 

정말 이것이 무엇인지 궁금했거든요. 


https://brunch.co.kr/@yudong/33 (1화 : 9/14) 

https://brunch.co.kr/@yudong/38 (6화 : 9/25) 겨우 2주간.. 


그때의 결론은 "자~ 이제 수많은 operators"를 공부해보자~ 였습니다. 


그렇게 생성 / 변환 / 조합 / 필터링 / 분기 / 예외처리 연산자등의 예제코드를 짜보고 내용을 배웠습니다. 

시간이 또 흘러갑니다.. 

이제 조금씩 알 것 같습니다. 


그런데 또 한가지 산에 부딪치게 됩니다 (벌써 몇달 전의 얘기입니다) 

"차가운(cold) Observable / 뜨거운(hot) Observable" 이게 뭐지?? 


2. 차가운 Observable


Observable은 데이터의 흐름입니다. 우리가 지금까지 짜오던 프로그램은 자바의 맴버 변수가 되었건 아니면 메서드의 인자가 되었건 내가 즉시 활용할 수 있도록 주어진 자료구조입니다. 


Obseravable은 시간성을 담고 있습니다. 내가 Observable 타입의 변수를 가지고 있다고 해도 


1) subscribe()를 하지 않으면 데이터 따위는 나오지 않습니다. 

2) subscribe()를 하더라도 onNext 이벤트가 발생하지 않으면 데이터는 나오지 않습니다. 

3) (ConnectableObservable)은 subscribe()를 하더라도 connect() 하지 않으면 데이터는 나오지 않습니다. 

등등등 ... 이렇게 머가 복잡한 것이 Observable입니다. 


시간성을 담고 있다는 것은 "선언적"으로 프로그래밍한다는 것입니다. 

"자~ Observable에서 데이터가 발행될 것을 알겠어. 그런데 지금은 쉬고 있어~ 

내가 subscribe()를 호출하여 구독을 시작하면 그때부터 데이터가 와야 하는 것이야" .. 이렇게 말하는 것입니다. 


심지어는 Observable에서 데이터는 한방에 모두 오는 것이 아닙니다. (시간을 가지고 옵니다)


자기만의 데이터 흐름(Observable)을 프로젝트에 맞게 설계하기 나름이지만 데이터가 한방에 주루룩 올지 아니면 시도 때도 없이 올지 그것은 Observable의 제공자의 마음입니다. 


클라이언트(구독자)는 그것이 "오게 되면 이렇게 처리하세요~" 라고 선언합니다. 

지금까지의 프로그래밍은 입력 데이터가 이미 존재하기 때문에 "즉시 이렇게 처리하세요" 라면  

RxJava의 리액티브 프로그래밍은 미래의 일에 대한 지침을 내리게 됩니다.  


느긋하게(lazy) 내가 원할 때부터 시작하는 Observable이 차가운 Observable입니다. 별도로 표기하지 않으면 지금까지 우리가 아는 Observable은 모두 차가운 Observable입니다. 


ps. 데이터 베이스에서 데이터를 쿼리하고 나오는 커서(ResultSet)은 Observable과 조금은 비슷합니다. DB에 연결하고 원하는 데이터를 가져옵니다. 데이터 가져오기(fetch)가 끝나면 한개씩 처리를 합니다. 물론 커서를 가져올때까지 blocking되는 것이 RxJava의 Observable과는 차이가 있습니다.  


3. 리액티브 프로그래밍? 


지난 9개월동안 많은 문서들이 발행되었습니다. 새로운 번역서도 나왔고 원서도 두어권 더 나왔습니다. 또한 리액티브(reactive)관련 커뮤니티들도 생겼습니다. 


(리액티브 프로그래밍 입문) : 제가 만든 페북 그룹입니다. RxJava , RxJS 위주입니다. 

https://www.facebook.com/groups/rxbasic/ 

(ReactiveX Lab) : 이재호님이 만든 페북 그룹입니다. 

https://www.facebook.com/groups/reactivexLab/  

(Rx Korea) : 손진규님이 운영중인 페북 그룹입니다. 

https://www.facebook.com/groups/rxkorea/ 


이러한 커뮤니티를 통해서 많은 Q&A와 문서들이 등록되는데요~ 

커뮤니티를 통해서 reactive라는 단어도 점차 "리액티브"로 굳어지는 것 같습니다. 

"반응형"이라는 우리말 단어보다 아직은 Rx가 미지의 영역이기에 "리액티브 프로그래밍"으로 부르는게 적절해보입니다. 


4. 뜨거운 Observable 


지금까지 차가운 Observable에 대해서 알아보았습니다. 

그렇다면 뜨거운 Observable은 무엇일까요? 


Observable이 느긋하게(lazy) 데이터의 발행을 내가 구독할 때 기다려주었다면.. 

뜨거운 Observable은 전혀 인자하지 않습니다. 


데이터를 받을 사람은 생각도 하지 않고 "보내는 사람"이 계속 보내는 것입니다. 

대표적인 예로 UI 이벤트(마우스, 키보드 이벤트 등), 주식 데이터, 센서 데이터 등등 


RxJava에서 기본적으로 제공하는 형태는 "차가운 Observable을 이용한 프로그래밍"입니다. 

그런데 이것만 가지고 프로젝트가 되나요? 


UI를 다룰때, 그리고 센서 데이터와 같이 HW에서 무작정 데이터가 발행될 때, 마지막으로 주식데이터와 같이 실시간으로 엄청난 data change가 발생하는 상황에서도 RxJava는 큰 힘을 발휘할 수 있습니다. 


오늘은 여기까지만 할께요~ 

아직 풀어놓을 이야기들이 많습니다. 


7화를 마치며 


오늘 알아야 할 것은 RxJava는 차가운 Observable을 기본적으로 제공한다. 

그런데 UI이벤트, 센서 데이터, 주식 데이터와 같은 경우에는 뜨거운 Observable을 활용해야 한다. 

뜨거운 Observable은 (차가운) Observable을 변환해서 만듭니다. 

이정도만 개념을 잡으셔도 좋을 것 같습니다. 


조만간 8화에서 뵙겠습니다. 뜨거운 Observable에 대해서 좀더 알아보겠습니다.  

작년엔 진짜 답답한 마음에서 브런치에 글을 올렸는데 이제는 조금 편하게 이야기할 수 있어서 좋네요 ^_^


오늘은 6.25입니다. 우리나라의 뼈아픈 전쟁의 역사에 대해서도 잠시 생각해보는 시간을 가지셨으면 합니다. 

EBS에서 관련 프로그램들이 계속 나오네요. 


감사합니다. 

2017.6.25 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari