Skip to content

[Android] RxJava

ByungKwan Yun edited this page Jul 19, 2021 · 9 revisions

RxJava

RxJava์— ๋Œ€ํ•ด ์„ค๋ช…

RxJava๋Š” Reactive Programming์„ ์ž๋ฐ”์—์„œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
Reactive Programming์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๋ณ€ํ™”์˜ ์ „๋‹ฌ์— ๊ด€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ,
๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋จผ์ € ์ •์˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ์—ฐ๊ด€๋˜๋Š” ํ•จ์ˆ˜๋‚˜ ์ˆ˜์‹์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ต์ €๋ฒ„ ํŒจํ„ด(Observer Pattern)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…

์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ์˜ต์ €๋ฒ„๋“ค์„ ๊ฐ์ฒด์— ๋“ฑ๋กํ•˜๊ณ ,
์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ๋“ฑ์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ ํ†ต์ง€ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

Subjectํด๋ž˜์Šค์— ๋Œ€ํ•ด ์„ค๋ช…

Subjectํด๋ž˜์Šค๋Š” Observableํด๋ž˜์Šค์„ ์ƒ์†ํ•˜๊ณ  Observer์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ฐœํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ Cold Observable์„ ๊ตฌ๋…ํ•œ ๋‹ค์Œ ์ด๋ฅผ ๋‹ค์‹œ ๋ฐฉ์ถœํ•จ์œผ๋กœ์จ Hot Observable๋กœ ๋ฐ”๊พธ๋Š” ์—ญํ• ๋„ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
์ œ๊ฐ€ Subject๋ฅผ ์‚ฌ์šฉํ•ด ๋ดค๋˜ ๊ฑด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋ฐฑ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์„œ ์ข…๋ฃŒํ•  ์‹œ์— BehaviorSubject๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

RxJava์˜ ํ๋ฆ„ ์ œ์–ด ํ•จ์ˆ˜

  • sample(): ํŠน์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฐœํ–‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
  • buffer(): ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ count๋งŒํผ ๋ชจ์•˜๋‹ค๊ฐ€ ๋ฐฉ์ถœํ•˜๊ฑฐ๋‚˜, skip ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์„œ skipํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • throttleFirst()์™€ throttleLast(): throttleFirst - ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋จ
  • window():
  • debounce():

subsribeOn()๊ณผ observeOn()์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…

subscribeOn() ํ•จ์ˆ˜๋Š” Observable์—์„œ ๊ตฌ๋…์ž๊ฐ€ subscribe()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ฐœํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
observeOn() ํ•จ์ˆ˜๋Š” ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
observeOn()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ›„ ๋™์ž‘ํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

RxJava์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•ด ์„ค๋ช…

  • newThread Scheduler: ๋‰ด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Computation Scheduler(๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ): ์ฃผ๋กœ ์ผ๋ฐ˜์ ์ธ ๊ณ„์‚ฐ ์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œํ’€์„ ์ƒ์„ฑํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋Š” CPU์˜ ๊ฐฏ์ˆ˜์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • IO Scheduler(IO ์Šค์ผ€์ค„๋Ÿฌ): ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ์ž‘์—…์ด๋‚˜ I/O์ž‘์—…์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋กœ ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ„์† ์ƒ์„ฑํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ์ž…๋‹ˆ๋‹ค.
  • Trampoline Scheduler(ํŠธ๋ ˜ํŽ„๋ฆฐ ์Šค์ผ€์ค„๋Ÿฌ): ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๋ฌดํ•œํ•œ ํฌ๊ธฐ์˜ ๋Œ€๊ธฐ ํ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ ˜ํŽ„๋ฆฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•ด๋ดค๋˜ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

RxJava์˜ subscribe()ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์„ค๋ช…

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์ž…๋‹ˆ๋‹ค.

RxJava์˜ map() vs flatMap()์˜ ์ฐจ์ด์ 

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ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.