brunch

매거진 ReactiveX

You can make anything
by writing

C.S.Lewis

by 한로니 Jul 10. 2016

RxJava, 마블 다이어그램

마블 다이어그램, Rx를 공부하면 필연적으로 마주하게 되는 도표다. 리액티브 세상에서 일어나는 모든 일들(비동기 데이터 흐름)은 마블 다이어그램으로 시각화된다. 따라서 이 도표를 익히는 것은 RxJava, RxSwift, RxJs, RxRuby 등 Rx의 다양한 포트들을 다루기 위한 첫걸음이라 할 수 있다. 이번 포스트에서는 마블 다이어그램에 대해서 살펴본다.


마블 다이어그램

옵저버블은 유한하거나 무한한 아이템을 발행할 수 있다. 위 그림에서 첫 번째 라인은 6개의 아이템을 발행하고 완료를 발행하는 유한한 옵저버블을 의미한다. 시간의 흐름은 왼쪽에서 오른쪽으로 이동하기 때문에 처음 발행하는 아이템은 빨간색이고, 마지막으로 발행하는 아이템은 보라색이다. 


발행된 아이템은 flip이라는 오퍼레이터에 의해 변환된다. (실제 Rx에서 flip이라는 함수는 존재하지 않는다. 위 다이어그램에서는 입력 값을 뒤집는다는 의미로 사용됐다.) flip에 의해 변환된 결과는 가장 아래쪽 라인으로 표현된다. X는 에러가 발생해서 종료됐음을 나타낸다. 따라서 이 마블 다이어그램에 의하면 하늘색, 파란색, 보라색 아이템은 발행되지 않는다. 


Observable.timeout()

특정 시간 내에 아이템이 발행되지 않으면 에러를 발행하는 timeout() 함수의 마블 다이어그램을 살펴보자.

입력 옵저버블은 5개의 아이템을 발행하고 종료한다. timeout() 함수에 1초라는 시간이 설정됐다고 가정했을 때, 빨간, 주황, 노란, 녹색 아이템은 1초마다 아이템이 발행된 것을 의미하고, 보라색 아이템은 1초 내에 발행되지 않았기 때문에 timeout() 함수는 에러를 발행한다.


Observable.merge()

이번에는 merge()와 mergeDelayError() 함수의 마블 다이어그램을 살펴보자.

merge() 함수는 두 개 이상의 옵저버블을 하나로 결합할 때 사용한다. 위 다이어그램에서는 두 개의 옵저버블을 입력으로 받는다. 첫 번째 옵저버블은 빨간색, 녹색, 에러를 발행한다. 두 번째 옵저버블은 노란색, 하늘색, 보라색, 완료를 발행한다. 첫 번째 옵저버블이 에러를 발행할 때 merge() 함수는 병합을 중단하고 에러를 발행한다. 따라서 두 번째 옵저버블의 마지막 아이템인 보라색은 발행되지 않는다. 


Observable.mergeDelayError()

다음은 mergeDelayError() 함수이다.

merge() 함수와 입력 값은 동일한다. 첫 번째 옵저버블이 에러를 발행하더라도 병합을 계속 수행한다. 즉, 두 번째 옵저버블이 완료를 발행할 때까지 작업을 수행한 후 에러를 발행한다. 


끝맺음

세 가지 예제를 통해서 마블 다이어그램을 살펴보았다. RxJava를 능숙하게 다르기 위해서는 마블 다이어그램에 익숙해질 필요가 있다. 공식 문서 또는 RxMarbles 웹사이트가 도움이 된다.

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