RxJava를 위한 사전지식
# Reactive Programming
(=반응형 프로그래밍, 리액티브 프로그래밍)
: 데이터 통지 시 '반응(React)'하여 데이터를 처리하는 프로그래밍 방식이며, 반응하기 위해 비동기적 데이터 처리 및 흐름 기반을 둔 프로그래밍 패러다임
# RecativeX
: 관찰가능한 시퀀스(Observable sequences)를 사용한 비동기 및 이벤트 기반 프로그램(Reactive Program)을 만들기 위한 라이브러리
# Reactive Stream
: 라이브러리나 프레임워크에 상관없이 데이터 스트림을 비동기적으로 다룰 수 있는 공통 메커니즘.
- RxJava1.x 개발 후 여기저기서 라이브러리와 프레임워크 만들어 같은 처리 서로 다른 방식 중구난방으로 관련 단체들이 모여 Stream을 비동기로 다루는 최소한의 API를 정하고 제공하게됨 (2015년 4월 Reactive Stream for JVM 1.0.0 릴리즈)
▶ 따라서 RxJava 2.x부터 Reactive Stream을 지원함. (RxJava 2.x(io.reativex.~)는 RxJava 1.x(rx.~/2018년 3월 종료됨)와 호환안됨)
# RxJava
: JVM용 ReactiveX(= Reactive Programming을 Java언어형으로 구현한 라이브러리)
- 데이터 스트림을 비동기로 처리하는 공통 메커니즘을 인터페이스로 제공
- 함수형 프로그래밍(FP)의 영향을 받아 대부분이 함수형 인터페이스를 인자로 받음
- 역사
: 2009년 마이크로소프트 에릭 마이어가 .NET프레임워크의 실험적인 라이브러리 'Reactive Extensions(=Rx)'를 공개 → 2013년 이를 넷플릭스에서 자바로 이식하면서 RxJava 시작됨
Why 'RxJava' on Android?
1) 비동기 처리 작업 구현해야해서
안드로이드 환경에서는 '비동기 처리'가 자주 필요하다.
나의 경험상 비동기 작업은 주로 사용자에게 빠른 서비스를 제공하기 위해 무거운 작업?(ex 서버 요청을 하거나 데이터를 가공 등)들을하는데 사용했다.
이를 통해 유일하게 UI작업을 처리할 수 있는 안드로이드 MainThread(=UI Thread)가 더욱 더 UI작업에만 집중할 수 있도록ㅎㅎ
+) 더불어, 안드로이드 '비동기 처리'하는 방법들이 현재 다 쓰기 어렵다;;
- 직접 Thread 생성 (권장하지 않음)
- AsyncTask (권장하였으나 Android 11 @Deprecated됨, sdkVersion13이상 일 때 여러 개의 AsyncTask가 동시에 실행되어도 순차적으로 호출된다고 함)
2) RxJava에서 이벤트나 데이터의 가공과 분배가 쉽다
이 부분은 설명하는 것보다 RxJava를 쓰면 확 느낄 수 있다. (괜히 Reactive 관련 개념들이 이벤트 처리를 강조하는 게 아니다)
- RxJava없이 특정 이벤트를 받거나 제외시키는 건 까탈스럽게? 조건문들을 걸어야한다.
그런데 RxJava에서는 그냥 '원하는 이벤트를 발생시키는 Observable'을 'Observer'로 subscribe(=구독)하면 된다.
- 또한, RxJava없이 비동기 처리를 통해 전달받은 데이터를 가공 시 개발자가 열심히 로직을 작성한다.
그런데 RxJava에서는 다양한 'Operator(=연산자)'를 제공하여 특정 이벤트만 전달, 이벤트 갯수 변경, 이벤트 전달 값의 변경 등이 가능하다. (덕분에, 개발자의 수고로운 로직 작업과 코드량이 줄어든다)
RxJava 구성요소
#1. Observable
: 이벤트를 만들어 이벤트 스트림(=Stream)을 통해 이벤트를 내보낸다(=emit)
#Stream(=Data Stream) 이란? : 시간에 따른 데이터 값들의 일련의 시퀀스 (=일종의 시간순으로 전달되지는 값들의 collection )
|
특징
-
Observable은 여러 이벤트를 만들어내거나 하나도 만들어내지 않을 수도 있다.
-
Stream은 특정 조건 만족시 종료되어 이벤트 생성 중지하거나 계속 유지시킬 수도 있다.
-
unsubscribe를 감지하여 subscribe하고 있는 Observer가 하나도 없으면 이벤트 생성을 위해 유지했던 리소스를 알아서 해제함
#2. Observer
: Observable에 의해 만들어진 이벤트를 감지하여, 이벤트를 받았을 때 수행할 작업을 정의한다.
특징
-
Observer가 Observable에서 만든 이벤트를 감지하려면 Observable을 관찰(=Observe)하는데,
이를 "Observer가 Observable을 subscribe한다" 라고 표현한다. -
반드시, subscribe해야 이벤트를 받을 수 있다.
#3. Operator (=연산자)
: Stream을 통해 전달되는 이벤트를 변환한다.
특징
-
이벤트가 가진 값을 변환, 특정 이벤트만 Stream에 보냄, 이벤트의 갯수 변경 등의 작업 가능
-
여러 연산자 중첩 사용가능하며, 적용순으로 이벤트 변환한다.
-
"Observable.연산자()" 형태로 사용하며, 대부분 Observable을 리턴하므로 중첩사용이 가능하다.
(ex) Observable.연산자1().연산자2()) -
연산자들의 종류는 추후 포스팅에서 정리예정
#4. Scheduler
: Observer나 연산자의 작업을 수행할 Thread를 지정한다.
특징
-
"Observable.observeOn(Scheduler를 통해 작업할 Thread 명시)" 함수를 통해 지정
-
위 메소드 호출 후 수행되는 Observer나 연산자의 작업을 지정한 Thread에서 실행
-
안드로이드 메인 스레드는 "Observable.observeOn(AndroidSchedulers.mainThread())"로 지정
'AndroidSchedulers'는 RxAndroid에 포함되어 따로 의존성 추가해야함
#5. Disposable
: Observable에서 만든 Stream과 Stream에 필요한 리소스를 관리하는 주체이며, 얘를 통해 unsubscribe가능
특징
-
Observer가 Observable을 subscribe할 때 생성됨
-
Disposable을 통해 subscribe해제(=unsubscribe) 가능
-
CompositeDisposable : 여러 Disposable을 하나의 객체에서 관리 가능하여, 생명주기에 따라 리소스를 관리하는 곳(Activity, Fragment 같은 UI컨트롤러들)에서 자주 사용됨
RxJava 구성요소들의 코딩 예는 추후 포스팅에서 정리예정
END!
스터디 도움 참조 블로그 (References)
- RecativeX 공식사이트
- Reactive Programming 개념
- Reactive Programming 필요성 및 전반적 이해 https://dev-daddy.tistory.com/25
- [도서] 커니의 코틀린, 김태호 저 | 인사이트 | 2017.12.08 http://book.naver.com/bookdb/book_detail.nhn?bid=12801360
- AsyncTask 분석 : 'sdkVersion13이상 일 때 여러 개의 AsyncTask가 동시에 실행되어도 순차적으로 호출된다' https://gist.github.com/benelog/5954649
- Reactive Programming : Stream 정의적 의미
- Reactive Programming : Stream 쉬운 의미 |