[Rx] 1. 리액티브 프로그래밍
리액티브 프로그래밍이란?
- 비동기 스트림을 이용한 데이터 처리
- 각각의 연산자를 통해 데이터를 가공 (filter, map, fold, switchmap... 등등)
- OOP, FP과 같은 프로그래밍 패러다임
it.debounce(400, TimeUnit.MICROSECONDS)
.switchMap { query -> handler(query,api)}
.startWith(QueryViewState.idel())
.distinctUntilChanged()
간단하게 설명하자면 데이터 가공을 400 밀리세 컨트로 제한하고
switchmap 가공되는 데이터를 미러링하여 인풋이 또 들어온다면 현재 가공 중인 데이터를 버리고 최신 데이터만 가공하며
또한 이 가공일 시작될때 QueryViewState.idle()이 먼저 시작되고
distinctUntilChaged()를 통해 중복 데이터를 제거한다.
위의 설명만 들어도 뭔 소린지 하나도 모르겠다 러닝 커브가 높은 건 사실이다..
리액티브 프로그래밍을 할때 알아야 할 개념들을 정리해보겠다.
프로그래밍 시나리오
1. Pull
외부의 명령을 받아 데이터를 처리하고, 데이터를 가져오기 위해선 비즈니스 로직을 여러 번 호출해야 한다.
2. Push
외부의 명령을 기다리지 않고, 응답이 오면 데이터를 처리한다. 데이터를 가져오기 위해서는 옵저브 패턴이 구축되어 퍼블리셔, 구독자와의 관계가 형성이 되어 있어야 한다.
부수 효과 (Side Effect)
fun some(
a :Int,
b:Int
):Int = a + b
위와 같이 인자로 a, b를 받아 두 개의 값을 더해주는 역할만 하는 함수다
이 함수는 순수하다 왜냐하면 부수 효과가 없기 때문이다.
그럼 부수 효과가 있는 함수는 뭘까?
var c = 10
fun(
a: Int
b: Int
): Int {
retrun a+b+c
}
외부의 변수를 참조하고 있고 c 값이 언제 어느 때 바뀔지 모른다.
이러한 형태를 순수하지 않은 함수라고 할 수 있다.
Observeble 형태
1. hot
- 구독자가 있든지 없든지 간에 퍼블리셔는 데이터를 발행합니다.
2. cold
- 구독자가 구독을 해야 퍼블리셔는 데이터를 발행합니다.
배압(Backpressure)
- 퍼블리셔가 데이터를 생성하는 것보다 구독자가 데이터를 처리하는 것이 현저하게 빠를 경우
- debounce, buffer와 같이 이슈를 처리할 수 있다.
Observeble
가공할 데이터에 맞게 데이터의 스트림을 생성해 내는 클래스이다.
이 클래스는 다음과 같은 종류가 있다. 상황에 맞게 사용하자.
1. Observable
- 최대 1000개의 미만의 데이터를 처리할 경우
- 가장 베이식한 형태이다
- GUI에 해당하는 이벤트를 처리할 경우 적합하다.
- 배압 이슈가 적다고 판단된다면 Remote API, Database 작업도 가능
2. Flowable
- 10000개 이상의 데이터를 처리하는 경우
- room을 통해 데이터를 가져오는 경우
- remote API를 통해 데이터를 가져오는 경우
3. maybe
- 이름과 같이 데이터가 있을 수 있고 없을 수 있다.
- 도입 배경은 발행 데이터가 null 값일 경우 처리를 위해??...
- single과 마찬가지고 1개 거나 0개 데이터를 발행하면 완료된다.
4. single
- 데이터를 한 개만 발행하면 완료된다.
- remote API를 통해 리스폰스 받을 경우 많이 사용된다.