Axe's Life

Rx ) ReactiveX 파헤쳐보기 본문

RxSwift Book/Rx

Rx ) ReactiveX 파헤쳐보기

devAxe 2020. 5. 16. 20:56

안녕하세요 Axe입니다!

오늘은 ReactiveX가 무엇인지 알아보겠습니다.

 

먼저, ReactiveX가 어떤 의미인지 알아보겠습니다.

 

ReactiveX의 풀네임은 'Reactive eXtensions'입니다.

reactive: 반응을 보이는 , extension: (세력, 영향력, 혜택 등의) 확대

ReactiveX가 반응을 확장한다는 의미를 가지고 있다는 것을 알 수 있습니다.

 

계속 ReactiveX라고 부르기 좀 귀찮죠?

그래서 ReactiveX를 Rx라고 더 줄여서 부릅니다!

저도 이제부터 편의를 위해 Rx로 부르겠습니다 :)

 

이제, Rx 사이트의 메인화면을 순서대로 탐색해보며 공부해봅시다!

ReactiveX

 

ReactiveX

CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others

reactivex.io

 

 

이걸 알면 Rx의 반은 배운거나 마찬가지입니다!

 

"An API for asynchronous programming with observable streams"

제일 처음 눈에 띄는 이 문장을 대충 해석해보면

"옵저버블 스트림으로 비동기 프로그래밍을 하기 위한 api이다!"

라는 것을 알 수 있습니다.

 

그럼

"옵저버블 스트림이 뭐죠?", "비동기가 뭐죠?"

이런 의문점이 들 겁니다.

 

먼저 비동기에 대해서는...

동기, 비동기, 비동기 프로그래밍과 관련된 내용을 다 넣기에는 무리가 있어, 이해하시기에 좋은 글과 영상을 남겨놓았습니다 :)

 

동기? 비동기?

 

동기와 비동기에 대해서

안녕하세요, 오늘은 프로그래밍 관련 내용으로 여러분들에게 소개하려고합니다. 첫 번째 내용은 프로그래밍에서 데이터를 처리하는 두 가지 모델 동기와 비동기에 대해서 이야기하겠습니다. ��

juyeop.tistory.com

 

비동기 프로그래밍?

 

위의 글과 영상을 보셨다면, 비동기에 대한 의문점은 해결하셨을 겁니다!

 

"비동기 프로그래밍을 하기 위한 api라는 건 알겠는데, 옵저버블 스트림은 뭔데요?"

 

네...

많이 궁금하시겠지만

옵저버블 스트림을 이해하기 전에 먼저 알아야 할 내용이 있기에, 옵저버블 스트림에 대한 설명은 이 글의 마지막에 하겠습니다!

 

 

 

조금 밑으로 내리면 보이는 이것의 정체는 바로!

 

Marble Diagram

Marble Diagram(마블 다이어그램)입니다.

마블 다이어그램은 Rx의 기능을 사용하고자 할 때, 그 기능의 이해에 도움이 되기 위한 도표라고 생각하시면 됩니다.

마블 다이어그램에 대한 상세한 내용은 이 글을 다 읽으신 후에 '마블 다이어그램?' 글을 보시면 됩니다!

 

 

 

또 밑으로 내려보면...

RxJava는 넣어주면서 RxSwift가 없다닛...

이러한 내용이 있는데요.

대충, " Rx는 어느 플랫폼에서나 다 쓸 수 있어!"라는 내용입니다 :)

Rx를 어느 플랫폼에서나 다 쓸 수 있는 이유는 말이죠!

바로 밑에서 설명하겠습니다 ;)

 

맨 밑으로 가보면...

여기 있는 이 두 목록이 보이실 겁니다.

 

오른쪽에 LANGUAGES의 밑을 보면, 뭐 여러 가지 Rx가 붙은 것들이 있습니다.

이것들이 바로 Rx를 어느 플랫폼에서나 쓸 수 있게해주는 것입니다!

 

Rx는 다양한 시리즈가 있습니다.

바로 위에서 말한 "어느 플랫폼에서나 다 쓸 수 있어!"를 기억하시죠?

이것이 가능한 이유는

Rx는 각 플랫폼마다 지원하는 시리즈, 정확히는 라이브러리가 존재하기 때문입니다.

 

iOS 플랫폼에서 Rx를 사용할 수 있게 해주는 RxSwift라이브러리,

Android 플랫폼에서 Rx를 사용할 수 있게 해주는 RxJava라이브러리

etc...

각 플랫폼의 개발 언어 앞에 Rx접두어를 붙인 이름의 라이브러리들을 만들어 놨기에 가능한 것이죠.

(총 18개의 Rx라이브러리가 있습니다)


이제 왼쪽의 DOCUMENTATION을 보겠습니다.

밑에 Observable, Operators, Single, Subject, Scheduler가 있죠?

이 5개가 Rx의 주요 기능입니다.

이중에서도 가장 중요한 것은 바로 Observable입니다.

"어? Observable이면, 옵저버블 스트림이랑 연관이 있는 건가?"

라고 생각하셨다면... 맞습니다!

 

 

먼저 한 퀘스트가 있다고 가정하겠습니다.

<퀘스트>

상황:

1. 오직 한 방향으로만 흐르는 강(stream)이 있습니다.
2. 물고기(value)는 강(stream)의 흐름방향으로 흘러갑니다.
3. 강에는 가끔 쓰레기(value)도 흘러갑니다.

목표:
'rx'라는 강에서 물고기를 건져, 회를 뜬다음, 팔아야 합니다.

당신이 한 일:
강에서 자동으로 물고기만 건져(filter) 회로 변환(map)하는 'A'시스템을 만들었습니다.
이 시스템은 사용자가 버튼을 누를 시(subscribe) 가동됩니다.

 

스트림은 주로 강으로 비유됩니다.

상식적으로 강은 한 방향으로만 흐르며, 우리가 무언가를 하지 않는 이상 아무 일도 생기지 않죠?

이것이 강과 스트림을 비유하는 이유입니다

어떠한 이벤트 스트림이 있다고 해도, 그것만으로는 아무 일도 일어나지 않습니다.

 


 

Observable도 강이라고 생각하시면 됩니다.

하지만

Observable은 강이지만, 특정한 강을 지칭할 때 사용한다고 생각하시면 됩니다.

다 같은 강이지만 한강, 낙동강처럼 특정한 강이 있죠?

스트림은 포괄적인 느낌이며, Observable은 스트림이지만, 특정 스트림을 의미한다고 생각하시면 됩니다.

 

'A'시스템을 가동하기 위해서는 버튼을 눌러야 합니다.

이 버튼을 누르는 행동인 subscribe 즉, 구독을 함으로써 시스템이 가동되겠죠.

하지만 우리는 그냥 강이 아닌 'rx'라는 강에서 가동이 되야겠죠?

 

그래서 우리는 'A'시스템을 'rx'강에서 가동하기 위해, 'rx'라는 Observable을 구독해야 합니다.

강은 수없이 많습니다. 그 수많은 강 중에서 특정한 강(Observable)을 구독해야 시스템은 그 강에서 가동될 것입니다.

그리고 Observable을 구독하지 않는 이상 아무 변화가 일어나지 않을 겁니다.

 

Operators는 스트림에 흐르는 값(value)을 가공하는 장치입니다.

위 퀘스트에서 우리는 물고기만 건져 회로 변환한다고 하였습니다.

장치(Operators)의 기능 중 물고기만을 건지게 해 주는 건 filter, 회로 변환하는 건 map.

Operators안에 filter와 map과 같은 기능들이 있다고 생각하시면 됩니다.

 

코드로 변환해 보면

import RxSwift

let disposeBag = DisposeBag()

let value = ["물고기", "쓰레기"] // 강에 흐르는 value
let rx = Observable.from(value) // Observable: value가 흐르는 'rx'강
    
rx
    .filter { $0 == "물고기" } // Operators: 물고기만 건짐
    .map { "\($0) 회" } // Operators: 물고기를 회로 만듦
    .subscribe { print($0.element ?? "") } // Subscribe: 'rx'강을 구독
    .disposed(by: disposeBag)
    
// 결과: 물고기 회

 

이러한 코드가 되는데...

위의 코드가 이해가 되지 않는 것은 걱정하지 않으셔도 됩니다. (공부하면 됩니다!)

rx라는 옵저버블이 있고, 그것을 구독한 다음에 값을 얻는다는 것만 아시면 됩니다.

 

나머지 single, subject, scheduler는 따로 글을 나누어서 자세히 설명하겠습니다 :)

 

그럼, 옵저버블 스트림이 무엇을 의미하는지는 어느 정도 감이 오시지 않나요?

Rx 사이트에서 말하는 이 '옵저버블 스트림'은 그냥 '옵저버블들'을 뜻하는 거라고 생각하시면 됩니다.

 

위에서 제가 퀘스트를 예를 들어 설명한것을 잘 이해하셨다면, 좀 허무하다고 생각하실 겁니다.

하지만, 허무하다는 건 옵저버블과 스트림에대한 이해가 어느정도 됐다는 거겠죠? :)


이제 여러분은, 옵저버블 스트림과 비동기 프로그래밍을 통달하셨습니다.

그럼 다시 한번 봐보겠습니다.

Rx는 "옵저버블 스트림으로 비동기 프로그래밍을 하기 위한 api이다!"

자! Rx가 옵저버블을 사용하여 비동기 프로그래밍을 하기 위한 api라는 것을 이해하셨죠?

그럼, Rx의 50%는 배웠다고 생각하면 됩니다!!

"나머지 50%는 제 블로그의 RxSwift Book 시리즈에서 채워나가면 됩니다! :)"

 

 

여태까지 ReactiveX사이트를 간단히 살펴보며 Rx에 대한 기본 지식을 조금이나마 쌓을 수 있었습니다!

앞으로 공부해야 하는 것이 훨씬 더 많지만, 금방 배우실 수 있을 거라고 생각합니다 :)

 


 

끝까지 봐주셔서 감사합니다!

여러모로 부족한 부분이 많기에 혹시라도 잘못된 정보가 있다면 댓글로 알려주시면 감사하겠습니다!

 

RxSwift Book 저장소: https://github.com/devMinseok/RxSwift_Book

 

devMinseok/RxSwift_Book

RxSwift문법이 정리된 저장소입니다. Contribute to devMinseok/RxSwift_Book development by creating an account on GitHub.

github.com

'RxSwift Book > Rx' 카테고리의 다른 글

Rx ) 마블 다이어그램?  (1) 2020.05.17
Comments