-
Notifications
You must be signed in to change notification settings - Fork 0
[Android] RxJava
RxJava๋ Reactive Programming์ ์๋ฐ์์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
Reactive Programming์ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๋ณํ์ ์ ๋ฌ์ ๊ดํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ผ๋ก,
๋ฐ์ดํฐ์ ํ๋ฆ์ ๋จผ์ ์ ์ํ๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋์์ ๋ ์ฐ๊ด๋๋ ํจ์๋ ์์์ด ์
๋ฐ์ดํธ ๋๋ ๋ฐฉ์์
๋๋ค.
์ต์ ๋ฒ ํจํด์ ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ์ต์ ๋ฒ๋ค์ ๊ฐ์ฒด์ ๋ฑ๋กํ๊ณ ,
์ํ ๋ณํ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ฉ์๋ ๋ฑ์ ํตํด์ ๊ฐ์ฒด๊ฐ ์ง์ ์ต์ ๋ฒ๋ค์๊ฒ ํต์งํ๋ ๋์์ธ ํจํด์
๋๋ค.
Subjectํด๋์ค๋ Observableํด๋์ค์ ์์ํ๊ณ Observer์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์
๋๋ค.
๋๋ฌธ์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐํํ ์๋ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋
ํ ์๋ ์์ต๋๋ค.
๊ทธ๋์ Cold Observable์ ๊ตฌ๋
ํ ๋ค์ ์ด๋ฅผ ๋ค์ ๋ฐฉ์ถํจ์ผ๋ก์จ Hot Observable๋ก ๋ฐ๊พธ๋ ์ญํ ๋ ํ ์ ์๋ ํด๋์ค์
๋๋ค.
์ ๊ฐ Subject๋ฅผ ์ฌ์ฉํด ๋ดค๋ ๊ฑด ์๋๋ก์ด๋์์ ๋ฐฑ๋ฒํผ ๋๋ฌ์ ์ข
๋ฃํ ์์ BehaviorSubject๋ก ๊ตฌํํ๋ ๊ฒฝํ์ด ์์ต๋๋ค.
- sample(): ํน์ ์๊ฐ ๊ฐ๊ฒฉ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค๋๋ค.
- buffer(): ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ count๋งํผ ๋ชจ์๋ค๊ฐ ๋ฐฉ์ถํ๊ฑฐ๋, skip ์ธ๋ฑ์ค๋ฅผ ์ค์ ํด์ skipํ ์ ์์ต๋๋ค.
- throttleFirst()์ throttleLast(): throttleFirst - ๊ณ์ฐ ์ค์ผ์ค๋ฌ์์ ๋น๋๊ธฐ๋ก ์คํ๋จ
- window():
- debounce():
subscribeOn() ํจ์๋ Observable์์ ๊ตฌ๋
์๊ฐ subscribe()ํจ์๋ฅผ ํธ์ถํ์ ๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐํํ๋ ์ค๋ ๋๋ฅผ ์ง์ ํ๋ ํจ์์
๋๋ค.
observeOn() ํจ์๋ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋
์์๊ฒ ์ ๋ฌํ๋ ์ค๋ ๋๋ฅผ ์ง์ ํ๋ ํจ์์
๋๋ค.
observeOn()ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ดํ ๋์ํ๋ ์ค๋ ๋๊ฐ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
- newThread Scheduler: ๋ด ์ค๋ ๋ ์ค์ผ์ค๋ฌ๋ ์์ฒญ์ ๋ฐ์ ๋๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํฉ๋๋ค.
- Computation Scheduler(๊ณ์ฐ ์ค์ผ์ค๋ฌ): ์ฃผ๋ก ์ผ๋ฐ์ ์ธ ๊ณ์ฐ ์์ ์ ์ฌ์ฉ๋๋ ์ค์ผ์ค๋ฌ๋ก ๋ด๋ถ์ ์ผ๋ก ์ค๋ ๋ํ์ ์์ฑํ๋ฉฐ ์ค๋ ๋ ๊ฐฏ์๋ CPU์ ๊ฐฏ์์ ๋์ผํฉ๋๋ค.
- IO Scheduler(IO ์ค์ผ์ค๋ฌ): ์ฃผ๋ก ๋คํธ์ํฌ ์์ ์ด๋ I/O์์ ์์ ์ฌ์ฉ๋๋ ์ค์ผ์ค๋ฌ๋ก ํ์ํ ๋๋ง๋ค ์ค๋ ๋๋ฅผ ๊ณ์ ์์ฑํ๋ ์ค์ผ์ค๋ฌ์ ๋๋ค.
- Trampoline Scheduler(ํธ๋ ํ๋ฆฐ ์ค์ผ์ค๋ฌ): ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์๊ณ ํ์ฌ ์ค๋ ๋์ ๋ฌดํํ ํฌ๊ธฐ์ ๋๊ธฐ ํ๋ฅผ ์์ฑํ๋ ์ค์ผ์ค๋ฌ์ ๋๋ค. ๊ทธ๋์ ํ์์ ํ๋์ฉ ๊บผ๋ด์ ์์ ์ ์ํํฉ๋๋ค. ํธ๋ ํ๋ฆฐ ์ค์ผ์ค๋ฌ๋ ์ ๋ ํ ์คํธ ์์ฑํ ๋ ์ฌ์ฉํด๋ดค๋ ๊ฒฝํ์ด ์์ต๋๋ค.
Observable์ subscribe()ํจ์๋ฅผ ํธ์ถํด์ผ ๋น๋ก์ ๋ณํํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋
์์๊ฒ ๋ฐํํฉ๋๋ค.
(just()ํจ์๋ง ํธ์ถํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ง ์์)
Flowable์ ๋ํด ์ค๋ช
Flowable์ RxJava2์์ ์๋ก ๋์
๋ ํด๋์ค๋ก ๋ฐฐ์ ์ด์๋ฅผ ์ํด ๋ณ๋๋ก ๋ถ๋ฆฌํ ํด๋์ค์
๋๋ค.
Flowable์์ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ ๋ฐฐ์ ์ด์ ๊ด๋ จ ํจ์๋ onBackpressureBuffer(), onBackpressureDrop(), onBackpressureLatest()๊ฐ ์์ต๋๋ค.
- onBackpressureBuffer(): 3๊ฐ์ง ์ต์
(ERROR, DROP_OLDEST, DROP_LATEST)์ด ์๋ค.
ย ย - ERROR: ์ผ์ ์์ ์ด๊ณผํด์ ์์ฐ์ Exception ๋ฐ์
ย ย - DROP_OLDEST: ๋ฒํผ ํฌ๊ธฐ๋งํผ ์๋น -> ๋ฒํผ ํฌ๊ธฐ๋งํผ ๋จ๊ธฐ๊ณ ๋ชจ๋ ๋ฒ๋ฆผ -> ๋ฒํผ ํฌ๊ธฐ๋งํผ ์๋น
ย ย - DROP_LATEST: ๋ฒํผ ํฌ๊ธฐ 2๋ฐฐ์ ๋ ์๋น -> ๋ง์ง๋ง ๋ฐ์ดํฐ ๋นผ๊ณ ๋ชจ๋ ๋ฒ๋ฆผ -> ๋ง์ง๋ง ๋ฐ์ดํฐ ์๋น
- onBackpressureDrop(): ๋ฒํผ ํฌ๊ธฐ๋งํผ ์๋น -> ๋จ์ ๋ฐ์ดํฐ ๋ชจ๋ ๋ฒ๋ฆผ
- onBackpressureLatest(): ๋ฒํผ ํฌ๊ธฐ๋งํผ ์๋น -> ๋ง์ง๋ง ๋ฐ์ดํฐ ๋นผ๊ณ ๋ชจ๋ ๋ฒ๋ฆผ -> ๋ง์ง๋ง ๋ฐ์ดํฐ ์๋น
(Flowable์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: 10,000๊ฐ ์ด์์ ์ฒ๋ฆฌ ์์ , ๋คํธ์ํฌ ํต์ , DB ์์ )
๋ฐฐ์(BackPressure)์ ๋ํด ์ค๋ช
๋ฐฐ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๋ณด๋ค ๋ฐํ ์๋๊ฐ ๋น ๋ฅผ ๋ ๋ฐ์ํ๋ ํ์์ ๋งํฉ๋๋ค.
RxJava์์๋ ๋ฐฐ์์ ์ปจํธ๋กคํ ์ ์๋ Flowableํด๋์ค๊ฐ ์๊ณ , ๋ฐ๋ก ์๋น์ค์ ์ ์ฉํด๋ณด์ง ์์์ต๋๋ค.
ํ์ง๋ง onBackpressureBuffer๋ onBackpressureDrop, onBackpressureLatest ํจ์๋ฅผ ํ ์คํธํด์ ๋น๊ตํด๋ณธ ๊ฒฝํ์ด ์์ต๋๋ค.
Hot observable๊ณผ Cold observable์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช
Hot Observable์ ๊ตฌ๋ ์์ ์๊ด์์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ Observable์ ๋๋ค.
๊ทธ๋์ ๊ตฌ๋ ์๋ Hot Observable์ด ๋ฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ์๋ถํฐ ๋ชจ๋ ์์ ํ ๊ฒ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ง์ฐ์ค ์ด๋ฒคํธ, ํค๋ณด๋ ์ด๋ฒคํธ, ์ผ์ ๋ฐ์ดํฐ ๋ฑ์ด Hot Observable์ ๋๋ค.
Hot Observable์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ ๋ฐฐ์์ ๊ณ ๋ คํด์ผ ํ๋ค๋ ์ ์ ๋๋ค.
Cold Observable์ ์ต์ ๋ฒ๊ฐ subscribe()ํจ์๋ฅผ ํธ์ถํ ๋ ์ค๋น๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ์๋ถํฐ ๋ฐํํฉ๋๋ค.
Observable, Single, Maybe ๋ฑ์ ๋ชจ๋ ์ฐจ๊ฐ์ด Observable์ ๋๋ค.
map()
ํจ์๋ 1๋1๋ก ์
๋ ฅ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํํ ์ ์๋ ํจ์์
๋๋ค.
๊ทธ๋์ API ํต์ ํ ์ด๋ค ๊ฐ๊ณต์ด ๋ ํ์ํ ๋ ์ฌ์ฉํ ์ ์๊ณ
API ํต์ ํ ๋ ์ฑ๊ณต ์๋ต ์ฝ๋ ์ธ์ Exception์ ๋์ ธ์ ๋๋จธ์ง๋ onError()๋ก ์ ๋ฌํ๊ฑฐ๋ ํ ๋ ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
flatMap()
ํจ์๋ Observable์ ๋ฆฌํดํ๋ ํน์ง์ด ์์ต๋๋ค.
๊ทธ๋์ ์ ๊ฐ ์ค์ ์๋น์ค์ ์ฌ์ฉํด ๋ณด์ง ์์์ง๋ง ์ฐ์์ ์ผ๋ก API๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ์
์๋ฅผ ๋ค๋ฉด ๋ก๊ทธ์ธํ ๋ ํ ํฐ์ ๋จผ์ ๊ฐ์ ธ์ค๋ API๋ฅผ ํธ์ถํ๊ณ ์ฑ๊ณตํ์๋ ํ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ API๋ฅผ ํธ์ถํ๋ค๊ฑฐ๋ ํ๋ ๊ฒฝ์ฐ
์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
RxJava์ map(), flatMap(), concatMap(), switchMap()์ ์ฐจ์ด์
๋ชจ๋ Observable๋ก๋ถํฐ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ํํ๋ก ๊ฐ๊ณตํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์์
๋๋ค.
- map(): 1๋1๋ก ์
๋ ฅ๊ฐ์ ๋ค๋ฅธ๊ฐ์ผ๋ก ๋ณํ
- flatMap(): 1๋N์ผ๋ก ์
๋ ฅ๊ฐ์ Observable๋ก ๋ฐํ. ์ธํฐ๋ฆฌ๋น(interleaving)์ ํ์ฉํฉ๋๋ค. ๊ทธ๋์ ์์ฐ์์ ์๋น์ ์๋๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, ์์ ๋ณด์ฅ์ด ๋์ง ์์ต๋๋ค.
- concatMap(): 1๋N์ผ๋ก ์
๋ ฅ๊ฐ์ Observable๋ก ๋ฐํ. ์ธํฐ๋ฆฌ๋น(interleaving)์ ํ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์์ฐ์์ ์๋น์ ์๋๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, ์์๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
- switchMap(): ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๊ธฐ์กด์ ์งํ ์ค์ด๋ ์์
์ ๋ฐ๋ก ์ค๋จํฉ๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ด ๋ฐํ๋์์ ๋ ๋ง์ง๋ง์ ๋ค์ด์จ ๊ฐ๋ง ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. ๋ณดํต ๋์ ์ผ๋ก ์ผ์๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
๊ตฌ๋ ์(Subscriber), ์ต์ ๋ฒ(Observer), ์๋น์(Consumer)
๋ค ๋ฐ์ดํฐ ์์ ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๋ฏ(RxJava ๋ฌธ์์๋ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๊ณ ์์ง ์๋ค๊ณ ํจ)
-
๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ํ๋ค
๋ ๋ง์ ๋ฉ์๋ ์ฒด์ด๋์ด ์๋ just() ํจ์ ๋ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ํ ๊ฒ์ ๋งํจ
RxJava
RxJava๋ฅผ ์ฌ์ฉํ ์ด์
RxJava๋ฅผ ์ฐ์ง ์์๋ Retrofit์ call ์ธํฐํ์ด์ค์ enqueue๋ฉ์๋๋ฅผ ํตํด์ ๋น๋๊ธฐ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง RxJava๋ฅผ ์ฌ์ฉํ๋ฉด callbackํ์์ด ์๋๋ผ ์ฒด์ด๋ ํ์์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ณ ์ฝ๋๋ฅผ ๋จ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ต๋๋ค.
Observable, Single, Completable, Maybe, Flowable์ ๋ํด ์ค๋ช
์ด๋ฆ | ๋ฐ์ดํฐ ๋ฐํ ๊ฐ๋ฅ ์ | ์ด๋ฒคํธ |
---|---|---|
Observable | ์ฌ๋ฌ ๊ฐ(๋ฌดํ) | 3๊ฐ (onNext, onComplete, onError) |
Single | 1๊ฐ | 2๊ฐ (onSuccess, onError) |
Maybe | 0 ~ 1๊ฐ | 3๊ฐ (onSuccess, onError, onComplete) |
Completable | X | 2๊ฐ (onComplete, onError) |
- Observable์ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ๋ฐ์ํ๋ ๋ฐ์ดํฐ ์์ค์ ๋๋ค.
- Single์ Observable์ ํน์ํ ํํ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋จ๊ณผ ๋์์ ์ข ๋ฃ๋๋ ๊ฐ์ฒด์ ๋๋ค.
- Maybe๋ Observable์ ํน์ํ ํํ๋ก ์ต๋ 1๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉฐ ๋ฐ์ดํฐ ์์ด๋ ์๋ฃ๋ ์ ์์ต๋๋ค.
- Completable์ DB์ insertํ๊ฑฐ๋ updateํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
Kotlin