Skip to content

Latest commit

ย 

History

History
1122 lines (623 loc) ยท 43.3 KB

RxJava.md

File metadata and controls

1122 lines (623 loc) ยท 43.3 KB

RxJava ๋์žฅ๋‚ด๊ธฐ

RxJava์— ๋Œ€ํ•˜์—ฌ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž

์ž‘์„ฑ์ž : ๋ฐ•ํƒœ์ž„

Present Time : 2018โ€“09-07-FRI


๋ชฉ์ฐจ

[TOC]

1. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ RxJava

1.1 ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

์ž๋ฐ” ์–ธ์–ด์™€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋Œ€๋žต ๋‘ ๊ฐ€์ง€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ์ •๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Œ.

  • ๊ธฐ์กด pull ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ push ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์œผ๋กœ ๋ฐ”๊พผ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „๊ตญ ๋งค์žฅ์˜ ๋งค์ถœ์•ก ์ •๋ณด๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง‘๊ณ„ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ๊ธฐ์กด์—๋Š” ๊ฐ ๋งค์žฅ์˜ ๋ณ€ํ™” ์ƒํ™ฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ(pull)์™€์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ณณ์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด(push ๋ฐฉ์‹)์ค€๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ง€์›์„ ๋ฐ›๋Š”๋‹ค.

    • ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ์ฝœ๋ฐฑ์ด๋‚˜ ์˜ต์„œ๋ฒ„ ํŒจํ„ด์„ ๋„˜์–ด RxJava๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋˜๋ ค๋ฉด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์š”
    • ์ฝœ๋ฐฑ์ด๋‚˜ ์˜ต์„œํผ ํŒจํ„ด์€ ์˜ต์„œ๋ฒ„๊ฐ€ 1๊ฐœ์ด๊ฑฐ๋‚˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งŽ์€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (๋Œ€ํ‘œ์  ์˜ˆ : ๋ฐ๋“œ๋ฝ, ๋™๊ธฐํ™” ๋ฌธ์ œ)
    • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์€ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค. (๋ถ€์ˆ˜ํšจ๊ณผ: ๊ฐ™์€ ์ž์›์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฒฝ์Ÿ์กฐ๊ฑด์— ๋น ์ง€๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ํ˜„์ƒ.)
      • ํ•œ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ์ •์ƒ ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ์ˆ˜์‹ญ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋‹จ์ผ ์ž์›์— ์ ‘๊ทผํ•˜๋ฉด ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๊ผฌ์ด๊ณ  ๋””๋ฒ„๊น…ํ•˜๋‹ค๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค.
    • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค โ€”โ€”> ์™œ์ฅฌ? . ๋”ฐ๋ผ์„œ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๋‹ค.
  • ํ•œ๋งˆ๋””๋กœ, โ€œํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€


1.2 RxJava ๋งŒ๋“  ์ด์œ 

๋„ทํ”Œ๋ฆญ์Šค์—์„œ RxJava๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ ํ•ต์‹ฌ์ ์ธ ์ด์œ  3๊ฐ€์ง€

  1. ๋™์‹œ์„ฑ์„ ์ ๊ทน์ ์œผ๋กœ ๋Œ์–ด์•ˆ์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. (Embrance Concurrency)

    ์ž๋ฐ”๊ฐ€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋„ทํ”Œ๋ฆญ์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋™์‹œ์„ฑ์„ ์ ๊ทน์ ์œผ๋กœ ๋Œ์–ด์•ˆ์•˜๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋‹ค์ˆ˜์˜ ๋น„๋™๊ธฐ ์‹คํ–‰ ํ๋ฆ„(์Šค๋ ˆ๋“œ ๋“ฑ)์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๊ฒƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ทจํ•ฉํ•˜์—ฌ ์ตœ์ข… ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

    โ€‹

  2. ์ž๋ฐ” Future๋ฅผ ์กฐํ•ฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. (Java Futures are Expensive to Compose)

    2013๋…„ ๋‹น์‹œ ์ž๋ฐ” 8์—์„œ ์ œ๊ณตํ•˜๋Š” CompletableFuture ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋น„๋™๊ธฐ ํ๋ฆ„์„ ์กฐํ•ฉํ•  ๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ์—†์—ˆ๋‹ค. RxJava์—์„œ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋น„๋™๊ธฐ ํ๋ฆ„์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. RxJava์—์„œ๋Š” ์กฐํ•จํ•˜๋Š” ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž๋ผ๊ณ  ํ•œ๋‹ค.

    โ€‹

  3. ์ฝœ๋ฐฑ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค. (Callbacks Have Their Own Problems)

    ์ฝœ๋ฐฑ์ด ์ฝœ๋ฐฑ์„ ๋ถ€๋ฅด๋Š” ์ฝœ๋ฐฑ ์ง€์˜ฅ ์ƒํ™ฉ์ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

    ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์€ ์ฝœ๋ฐฑ์ด๋‹ค. ๊ทธ๋ž˜์„œ RxJava๋Š” ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์„ ํ•„ํ„ฐ๋ง, ๋ณ€ํ™˜, ์กฐํ•ฉํ•˜์—ฌ ์œ„ ์„ธ๊ฐ€์ง€ ํ•ต์‹ฌ์ด์œ ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


1.3 RxJava ๋ง›๋ณด๊ธฐ

Observable.just("Hello", "RxJava2")
  .subscribe(System.out::println);
  • Observable ํด๋ž˜์Šค : ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด Observable์—์„œ ์‹œ์ž‘

  • just() ํ•จ์ˆ˜ : ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ Observable ์„ ์–ธ ๋ฐฉ์‹. Ex) Observable.just(โ€œHello!โ€, โ€œRxJava2!!โ€).subscribe(System.out::println);

  • subscribe() ํ•จ์ˆ˜ : Observable์„ ๊ตฌ๋…. Observable์€ subscribe() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ๋น„๋กœ์†Œ ๋ณ€ํ™”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐœํ–‰ํ•œ๋‹ค.

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

  • System.out::println

  • data -> System.out.println(data)


1.4 RxJava ์†Œ๊ฐœ, ํŠน์ง•

  • RxJava๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์ง€ํ–ฅํ•˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๋‹ค.
  • ์ž๋ฐ”๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ RxJava ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ๋œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณต.

    • ์ด ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž ๋•๋ถ„์— RxJava๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋˜๋Š” ๊ฒƒ
    • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ธ โ€˜ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€™ ๋ฐฉ์‹์œผ๋กœ โ€˜์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจโ€™์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ
  • RxJava๊ฐ€ ์–ด๋ ค์šด ์ด์œ 

    • ํ•จ์ˆ˜ํ˜• ์—ฐ์‚ฐ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ

    • โ€œRxJava๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์—์„œ ๊ฐ€์žฅ ํ™”์ œ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ ์ฒ˜์Œ์— ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.โ€

  • ๊ถŒ์žฅํ•˜๋Š” ํ•™์Šต์ˆœ์„œ

  1. Observable ํด๋ž˜์Šค ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ด (ํŠนํžˆ ๋œจ๊ฑฐ์šด(Hot) Observable๊ณผ ์ฐจ๊ฐ€์šด(Cold) Observable์˜ ๊ฐœ๋…์„ ๊ผญ ์ดํ•ดํ•ด์•ผ ํ•จ)

  2. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ map(), filter(), reduce, flatMap() ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค.

  3. ์ƒ์„ฑ ์—ฐ์‚ฐ์ž, ๊ฒฐํ•ฉ ์—ฐ์‚ฐ์ž, ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž ๋“ฑ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ฃผ์š” ํ•จ์ˆ˜๋ฅผ ๊ณต๋ถ€

  4. ์Šค์ผ€์ค„๋Ÿฌ์˜ ์˜๋ฏธ๋ฅผ ๋ฐฐ์šฐ๊ณ  subscribeOn()๊ณผ observeOn() ํ•จ์ˆ˜์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋‘ก๋‹ˆ๋‹ค.

โ€‹5. ๊ทธ ๋ฐ–์˜ ๋””๋ฒ„๊น…, ํ๋ฆ„ ์ œ์–ด ํ•จ์ˆ˜๋ฅผ ์ตํž™๋‹ˆ๋‹ค.

2์žฅ(Observable) => 3์žฅ(map-filter-reduce) => 4์žฅ(์ฃผ์š” ์—ฐ์‚ฐ์ž) => 5์žฅ(RxJava ๋•Œ๋ฌธ์— ๋‹ฌ๋ผ์ง€๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์Šค์ผ€์ค„๋Ÿฌ) => 6์žฅ(RxAndroid) => 7์žฅ(๋””๋ฒ„๊น…, ์˜ˆ์™ธ์ฒ˜๋ฆฌ)

  • ์ž๋ฐ” 8์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋จ. ์ž๋ฐ” 8์—์„œ ์ œ๊ณตํ•˜๋Š” Consumer, Predicate, Function๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž์ฒด ๊ตฌํ˜„ํ–ˆ์œผ๋ฏ€๋กœ ์ž๋ฐ” 6 ์ด์ƒ์ด๋ฉด ๋™์ž‘.
    • But, 8์˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹๊ณผ ํ•จ์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์„ ์ข‹๊ฒŒํ•จ. (๋žŒ๋‹ค์‹ & ํ•จ์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค ๊ณต๋ถ€)

1.5 ๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ

  • ๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ์€ RxJava๋ฅผ ์ดํ•ดํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ
  • RxJava๋Š” ๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋ฐฐ์šด๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ๋‹ค.

marbleDiagram



2. Observable

  • RxJava๋Š” Observable์—์„œ ์‹œ์ž‘ํ•ด Observable๋กœ ๋๋‚œ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ ์ •๋„๋กœ ์ค‘์š”ํ•œ ๊ฐœ๋….

  • RxJava 1.x ์—์„œ๋Š” Observable, Single ํด๋ž˜์Šค

    • 2.x ์—์„œ๋Š” Observable, Maybe, Flowable ํด๋ž˜์Šค (์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ธ๋ถ„ํ™”ํ•ด ๊ตฌ๋ถ„ํ•ด ์‚ฌ์šฉ)

      โ€‹

2.1 Observable ํด๋ž˜์Šค

  • Observable์€ ์˜ต์„œ๋ฒ„(observer) ํŒจํ„ด์„ ๊ตฌํ˜„

    • ์˜ต์„œ๋ฒ„ ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ด€์ฐฐ์ž(์˜ต์„œ๋ฒ„) ๋ชฉ๋ก์„ ๊ฐ์ฒด์— ๋“ฑ๋ก
  • ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ๋ชฉ๋ก์˜ ๊ฐ ์˜ต์„œ๋ฒ„์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

    • ๋ผ์ด๋ธŒ์‚ฌ์ดํด์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ณดํ†ต ๋‹จ์ผ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€ํ™”๋งŒ ์•Œ๋ฆฐ๋‹ค.
  • Observable์€ ๋ฌด์Šจ ๋œป?

    • ์ง๊ด€์ ์œผ๋กœ => ๊ด€์ฐฐ์ž(Observer)๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ๋Œ€์ƒ
  • ์กฐ๊ธˆ ๋ถ€์กฑํ•ด! => Observed๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๊ด€์ฐฐ์„ ํ†ตํ•ด์„œ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋ฉด, Observable์€ ํ˜„์žฌ๋Š” ๊ด€์ฐฐ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋ก ์„ ํ†ตํ•ด์„œ ์•ž์œผ๋กœ ๊ด€์ฐฐํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์˜ต์„œ๋ฒ„ ํŒจํ„ด์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ ) ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฒ„ํŠผ์— ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด ๋‘” onClick() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ

  • RxJava์˜ Observable์€ ์„ธ๊ฐ€์ง€์˜ ์•Œ๋ฆผ์„ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ

    • onNext : Observable์ด ๋ฐ์ดํ„ฐ์˜ ๋ฐœํ–‰์„ ์•Œ๋ฆฐ๋‹ค. ๊ธฐ์กด์˜ ์˜ต์„œ๋ฒ„ ํŒจํ„ด๊ณผ ๊ฐ™์Œ.
  • onComplete : ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ๋ฐœํ–‰์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค. onComplete์ด๋ฒคํŠธ๋Š” ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ, ๋ฐœ์ƒํ•œ ํ›„์—๋Š” ๋” ์ด์ƒ onNext ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์„  ์•ˆ ๋œ๋‹ค.

    • onError : ์—๋Ÿฌ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ. onError ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ดํ›„์— onNext ๋ฐ onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, Observable์˜ ์‹คํ–‰์„ ์ข…๋ฃŒ.
  • Observable ํด๋ž˜์Šค์— ๋งŽ์€ ์ˆ˜์˜ ํ•จ์ˆ˜ ์กด์žฌ (Observable์„ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜, ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜, ๋””๋ฒ„๊ทธ ๋ฐ ์˜ˆ์™ธ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํฌํ•จ)

  • Observable์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ •์  ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ.

    • 1.x ๊ธฐ๋ณธ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ : create(), just(), from()
  • 2.x ์ถ”๊ฐ€ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ : fromArray(), fromIterable(), fromCallable(), fromFuture(), fromPublisher()

    • ๊ธฐํƒ€ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ : interval(), range(), timer(), defer()

2.2 ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜

Observable์„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜.

Observable์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ •์  ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

2.2.1 just()

  • ์ธ์ž๋กœ ๋„ฃ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐœํ–‰ํ•˜๊ณ  Observable์„ ์ƒ์„ฑ
  • 1~10๊ฐœ์˜ ์ธ์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ. (๋‹จ, ํƒ€์ž…์€ ๋ชจ๋‘ ๊ฐ™์•„์•ผํ•จ)

2.2.2 subscribe() ํ•จ์ˆ˜ / Disposable ๊ฐ์ฒด

1. subscibe() ํ•จ์ˆ˜
  • ๋‚ด๊ฐ€ ๋™์ž‘์‹œํ‚ค๊ธฐ ์›ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์ „์— ์ •์˜ํ•ด๋‘” ๋‹ค์Œ ์‹ค์ œ ๊ทธ๊ฒƒ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์„ ์กฐ์ ˆ => subscribe()

  • just() ๋“ฑ์˜ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ •์˜ํ•œ ํ›„, subscribe()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•จ.

  • ์ฃผ์š” ์›ํ˜•(4๊ฐ€์ง€)

    • ํŠน์ง• : ๋ชจ๋‘ Disposable ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•จ.
    ์›ํ˜• ํŠน์ง•
    Disposable subscribe() ์ธ์ž์—†์Œ, onNext์™€ onComplete ์ด๋ฒคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  onError ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋งŒ exception throwํ•จ. ==> ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊น…ํ•  ๋•Œ ํ™œ์šฉ
    Disposable subscribe(Consumer<? super T> onNext) ์ธ์ž๊ฐ€ 1๊ฐœ ์žˆ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ์€ onNext ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ / ์ด๋•Œ๋„ onError ๋ฐœ์ƒํ•˜๋ฉด exception์„ ๋˜์ง
    Disposable subscribe (Consumer<? super T> onNext, Consumer<? super java.lang.Throwable> onError) onNext์™€ onError ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    Disposable subscibe(Consumer<? super T> onNext, Consumer<? super java.lang.Throwable> onError, Action OnComplete) onNext, onError, onComplete ์ด๋ฒคํŠธ ๋ชจ๋‘ ์ฒ˜๋ฆฌ

    โ€‹

2. Disposable ๊ฐ์ฒด
  • void dispose() / boolean isDisposed() => 2๊ฐœ ํ•จ์ˆ˜๋งŒ ์กด์žฌ

  • dispose()

    • Observable์—๊ฒŒ ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๋Š” ํ•จ์ˆ˜

    • Observable์ด onComplete ์•Œ๋ฆผ์„ ๋ณด๋ƒˆ์„ ๋•Œ, ์ž๋™์œผ๋กœ dispose()๋ฅผ ํ˜ธ์ถœํ•ด

      Observable๊ณผ ๊ตฌ๋…์ž์˜ ๊ด€๊ณ„๋ฅผ ๋Š๋Š”๋‹ค. => ๋”ฐ๋กœ dispose() ํ˜ธ์ถœ X

  • isDisposed()

    • Observable์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๋Š”์ง€ (๊ตฌ๋…์„ ํ•ด์ง€ํ–ˆ๋Š”์ง€) ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
    • ๊ตฌ๋…์„ ํ•ด์ง€ํ–ˆ์œผ๋ฉด -> true

2.2.3 create() ํ•จ์ˆ˜

  • onNext, onComplete, onError ๊ฐ™์€ ์•Œ๋ฆผ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผํ•จ.
    • ๋ฐ˜๋ฉด์—) just() ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด ์ž๋™์œผ๋กœ ์•Œ๋ฆผ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
  • (RxJava์˜ javadoc์— ๋”ฐ๋ฅด๋ฉด) create()๋Š” RxJava์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๋งŒ ํ™œ์šฉํ•˜๋„๋ก ๊ถŒ๊ณ 
    • ๋‹ค๋ฅธ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Œ

2.2.4 fromXXX() ๊ณ„์—ด ํ•จ์ˆ˜

  • ๋‹จ์ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ ๋•Œ fromXXX() ๊ณ„์—ด ํ•จ์ˆ˜ ์‚ฌ์šฉ
    • just(), create() ๋Š” ๋‹จ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค˜์Œ.
  • RxJava2์—์„œ from() ํ•จ์ˆ˜ ์„ธ๋ถ„ํ™” ๋จ.
    • RxJava 1.x์—์„œ๋Š” from(), fromCallable() ๋งŒ ์‚ฌ์šฉ
    • from() ์„ ๋ฐฐ์—ด, ๋ฐ˜๋ณต์ž, ๋น„๋™๊ธฐ ๊ณ„์‚ฐ ๋“ฑ์— ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ๋ชจํ˜ธํ•จ์ด ์žˆ์–ด ์„ธ๋ถ„ํ™”ํ•จ.

2.2.4.1 fromArray() ํ•จ์ˆ˜

  • ๋ฐฐ์—ด์ด ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
    • Observable.fromArray(arr)
  • RxJava์—์„œ int ๋ฐฐ์—ด์„ ์ธ์‹์‹œํ‚ค๋ ค๋ฉด Integer[] ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ.

2.2.4.2 fromIterable() ํ•จ์ˆ˜

  • Observable์„ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ Iterable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ Observable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ.
  • Iterable< E > ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šค
    • ArrayList(List), ArrayBlockingQueue(BlockingQueue), HashSet(Set), LinkedList, Stack, TreeSet, Vector ๋“ฑ..
List<String> foods = new ArrayList<>();
foods.add("pizza");
foods.add("chicken");
foods.add("hamburger");

Observable<String> source = Observable.fromIterable(foods);
source.subscribe(System.out::println);

/* ์‹คํ–‰๊ฒฐ๊ณผ
pizza
chicken
hamburger
*/

2.2.4.3 fromCallable() ํ•จ์ˆ˜

2.2.4.4 fromFuture() ํ•จ์ˆ˜

2.2.4.5 fromPublisher() ํ•จ์ˆ˜


2.2 Single ํด๋ž˜์Šค

  • Observable์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ (1.x ๋ฒ„์ „๋ถ€ํ„ฐ ์กด์žฌ)

  • Observable ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํ•œํ•˜๊ฒŒ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Single ํด๋ž˜์Šค๋Š” ์˜ค์ง 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐœํ–‰ํ•˜๋„๋ก ํ•œ์ •

    • ๋ณดํ†ต ๊ฒฐ๊ณผ๊ณผ ์œ ์ผํ•œ ์„œ๋ฒ„ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๊ฐ€ ๋ฐœํ–‰๊ณผ ๋™์‹œ์— ์ข…๋ฃŒ

    • ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€์ ์—์„œ onNext() / onComplete() ํ•จ์ˆ˜๊ฐ€ onSuccess() ๋กœ ํ†ตํ•ฉ
    • onSuccess(T value) / onError() ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ

2.2.1 Single ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• - just()

Single ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ just() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Single.just(โ€œHello Singleโ€);

2.2.2 Observable์—์„œ Single ํด๋ž˜์Šค ์‚ฌ์šฉ

  • Single์€ Observable์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์ด๋ฏ€๋กœ Observable์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Observable ํด๋ž˜์Šค์—์„œ Single ํด๋ž˜์Šค ์‚ฌ์šฉ

2.2.3 Single ํด๋ž˜์Šค์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

just() ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ~?

Observable.just("one","error").single("default item");
  • ์—๋Ÿฌ ๋ฐœ์ƒ!!
  • ๋‘๋ฒˆ์งธ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋ฉด์„œ onNext ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋จ
    • (IllegalArgumentException: Sequence contains more than one element!)

2.3 Maybe ํด๋ž˜์Šค

  • RxJava2์— ์ฒ˜์Œ ๋„์ž…๋œ Observable์˜ ๋˜ ๋‹ค๋ฅธ ํŠน์ˆ˜ํ˜•ํƒœ
    • RxJava1.X ์—๋Š” ์—†์—ˆ์Œ.
  • Single ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ๋Œ€ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰ ์—†์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๋ฐœ์ƒ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Single : 1๊ฐœ ์™„๋ฃŒ / Maybe : 0 or 1 ์™„๋ฃŒ
  • ์ƒ์„ฑ๋ฐฉ๋ฒ•
    • Maybe ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
    • ๋ณดํ†ต Observable์˜ ํŠน์ • ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ๋•Œ๊ฐ€ ๋งŽ์Œ
      • elementAt(), firstElement(), flatMapMaybe(), lastElement(), reduce(), singleElement() ํ•จ์ˆ˜ ๋“ฑ

2.4 ๋œจ๊ฑฐ์šด VS. ์ฐจ๊ฐ€์šด Observable

  • Observable 2๊ฐ€์ง€๋กœ ๋‚˜๋‰จ ==> ๋œจ๊ฑฐ์šด Observable / ์ฐจ๊ฐ€์šด Observable
  • ์ฐจ๊ฐ€์šด -> ๋œจ๊ฑฐ์šด ๋ณ€ํ™˜ ๊ฐ€๋Šฅ (Subject ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ConnectableObservable ํด๋ž˜์Šค ํ™œ์šฉ)

2.4.1 ์ฐจ๊ฐ€์šด Observable

  • Observable์„ ์„ ์–ธํ•˜๊ณ  just() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์˜ต์„œ๋ฒ„๊ฐ€ subscribe() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌ๋…ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ==> ๊ฒŒ์œผ๋ฅธ ์ ‘๊ทผ๋ฒ•
    • ์˜ˆ์‹œ) ์›น ์š”์ฒญ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์™€ ์ฝ๊ธฐ ๋“ฑ / ๋‚ด๊ฐ€ ์›ํ•˜๋Š” URL์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ์„œ๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ด
  • ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•˜๋ฉด ์ค€๋น„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐœํ–‰.
  • ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฌ๊ฑฐ, ์•ž์œผ๋กœ๋„ ๋ณ„๋„์˜ ์–ธ๊ธ‰์ด ์—†์œผ๋ฉด ์ฐจ๊ฐ€์šด Observable

2.4.2 ๋œจ๊ฑฐ์šด Observable

  • ๊ตฌ๋…์ž๊ฐ€ ์กด์žฌ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•จ. => ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ, ๊ตฌ๋…์ž๋กœ์„œ๋Š” Observable์—์„œ ๋ฐœํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ˆ˜์‹ ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • ๊ตฌ๋…ํ•œ ์‹œ์ ๋ถ€ํ„ฐ Observable์—์„œ ๋ฐœํ–‰ํ•œ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.
    • ์˜ˆ์‹œ) ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ, ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ, ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ, ์„ผ์„œ ๋ฐ์ดํ„ฐ, ์ฃผ์‹ ๊ฐ€๊ฒฉ ๋“ฑ
  • ์ฃผ์˜ํ• ์  ) ๋ฐฐ์••์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ.
    • ๋ฐฐ์••์€ Observable์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ์†๋„์™€ ๊ตฌ๋…์ž๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์†๋„์˜ ์ฐจ์ด๊ฐ€ ํด ๋•Œ ๋ฐœ์ƒ
    • Flowable์ด๋ผ๋Š” ํŠนํ™” ํด๋ž˜์Šค์—์„œ ๋ฐฐ์••์„ ์ฒ˜๋ฆฌ

2.5 Subject ํด๋ž˜์Šค

Subject ํด๋ž˜์Šค๋Š” ์ฐจ๊ฐ€์šด Observable์„ ๋œจ๊ฑฐ์šด Observable๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

2.5.1 Subject ํด๋ž˜์Šค์˜ ํŠน์„ฑ

  • Observable์˜ ์†์„ฑ๊ณผ ๊ตฌ๋…์ž์˜ ์†์„ฑ์ด ๋ชจ๋‘ ์žˆ๋‹ค.
    • Observable ์ฒ˜๋Ÿผ) ๋ฐ์ดํ„ฐ ๋ฐœํ–‰ ๊ฐ€๋Šฅ
    • ๊ตฌ๋…์ž ์ฒ˜๋Ÿผ ) ๋ฐœํ–‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

2.5.2 ์ฃผ์š” Subject ํด๋ž˜์Šค

์ฃผ์š” Subject ํด๋ž˜์Šค์—๋Š” AsyncSubject / BehaviorSubject / PublishSubject / ReplaySubject ๋“ฑ์ด ์žˆ๋‹ค.

2.5.2.1 AsyncSubject ํด๋ž˜์Šค

2.5.2.2 BehaviorSubject ํด๋ž˜์Šค

2.5.2.3 PublishSubject ํด๋ž˜์Šค

2.5.2.4 ReplaySubject ํด๋ž˜์Šค

2.6 ConnectableObservable ํด๋ž˜์Šค



3. ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž - ๊ธฐ์ดˆ

3.1 ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž ํŠน์ง•

  • ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๊ฐ€ ์กด์žฌ

    • ํ•˜์ง€๋งŒ, ๋ชจ๋‘ ์•Œ์•„์•ผ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๋‹ค
      • ํ•„์ˆ˜ ์—ฐ์‚ฐ์ž์˜ ๊ฐœ๋…์„ ์•Œ๋ฉด ๋‚˜๋จธ์ง€๋Š” ํ•„์ˆ˜ ์—ฐ์‚ฐ์ž์—์„œ ํŒŒ์ƒ๋œ ์—ฐ์‚ฌ์ž์ด๋ฏ€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
  • ์–ธ์–ด ํŠน์„ฑ๊ณผ ํฌ๊ฒŒ ์—ฐ๊ด€์ด ์—†๋‹ค.

    • ReactiveX๋Š” ์ž๋ฐ” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋‹ท๋„ท, ์Šค์นผ๋ผ, ํด๋กœ์ €, ์Šค์œ„ํ”„ํŠธ์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž ๋ชฉ๋ก ํ•จ๊ป˜ ์ œ๊ณต
    • RxJava์— ์ต์ˆ™ํ•ด์ง€๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋„ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ์ตํž ์ˆ˜ ์žˆ์Œ.

3.2 ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜

์—ฐ์‚ฐ์ž ์ข…๋ฅ˜ ๋ฌด์—‡ Ex
์ƒ์„ฑ(Creating) ์—ฐ์‚ฐ์ž Observable, Single ํด๋ž˜์Šค ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ํ•จ์ˆ˜ create(), just(), fromArray(), interval(), range(), timer() ๋“ฑ
๋ณ€ํ™˜(Transforming) ์—ฐ์‚ฐ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์›ํ•˜๋Š” ์ถœ๋ ฅ์„ ๋‚ด๋Š” ์ „ํ†ต์ ์ธ ์˜๋ฏธ์˜ ํ•จ์ˆ˜ map(), flatmap() ๋“ฑ
ํ•„ํ„ฐ(Filter) ์—ฐ์‚ฐ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ค‘ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ๋ƒ„ filter(), first(), take() ๋“ฑ
ํ•ฉ์„ฑ(Combining) ์—ฐ์‚ฐ์ž ์—ฌ๋Ÿฌ Observable ์กฐํ•ฉ
์˜ค๋ฅ˜์ฒ˜๋ฆฌ(Error Handling) ์—ฐ์‚ฐ์ž onErrorReturn(), onErrorResumeNext(), retry() ๋“ฑ
์œ ํ‹ธ๋ฆฌํ‹ฐ(Utility) ์—ฐ์‚ฐ์ž subscribeOn(), observeOn()
์กฐ๊ฑด(Conditional) ์—ฐ์‚ฐ์ž Observable์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์—ญํ• 
์ˆ˜ํ•™๊ณผ ์ง‘ํ•ฉํ˜• ์—ฐ์‚ฐ์ž ์ˆ˜ํ•™ ํ•จ์ˆ˜์™€ ์—ฐ๊ด€์žˆ๋Š” ์—ฐ์‚ฐ์ž
๋ฐฐ์••(Back pressure) ์—ฐ์‚ฐ์ž ๋ฐฐ์•• ์ด์Šˆ์— ๋Œ€์‘ํ•˜๋Š” ์—ฐ์‚ฐ์ž
  • 2017๋…„ 5์›” ๋“ฑ๋ก๋œ ์—ฐ์‚ฐ์ž ๊ฐœ์ˆ˜: 400๊ฐœ ์ด์ƒ

3.3 map() ํ•จ์ˆ˜

  • ์ž…๋ ฅ๊ฐ’์„ ์–ด๋–ค ํ•จ์ˆ˜์— ๋„ฃ์–ด์„œ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
    • String์„ String์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ , String์„ Integer๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ
  • .map(ball -> ball + โ€œ*โ€);
    • map ์›ํ˜• : public final Observable map(Function<? super T, ? extends R> maper)
      • ์ฆ‰ map ํ•จ์ˆ˜ ์ธ์ž โ€˜ Function<? super T, ?extends R> mapperโ€™ ์— โ€˜ball->ball+โ€*โ€ โ€˜ ๋“ค์–ด๊ฐ„๊ฑฐ
      • Function ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด ๋ถ„๋ฆฌ
        • Function<String, String> getStar = ball -> ball + โ€œ*โ€ ;
        • .map(getStar) // ์›๋ž˜๋Š” .map(ball -> ball + โ€œ*โ€); ์ด๊ฑฐ ์˜€์Œ
  • map() ํ•ต์‹ฌ
    • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์„ โ€˜์–ด๋–ค ํ•จ์ˆ˜โ€™ ์— ๋„ฃ๋Š” ๊ฒƒ
      • ์–ด๋–ค ํ•จ์ˆ˜ : Function ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด / ๋žŒ๋‹ค ํ‘œํ˜„์‹
    • ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š๋ƒ๊ฐ€ ๊ด€๊ฑด

3.3_map


3.4 flatMap() ํ•จ์ˆ˜

  • map()์„ ์ข€ ๋” ๋ฐœ์ „์‹œํ‚จ ํ•จ์ˆ˜
  • ๊ฒฐ๊ณผ๊ฐ€ Observable๋กœ ๋‚˜์˜ด
  • flatMap() => ์ผ๋Œ€๋‹ค or ์ผ๋Œ€์ผ Observable ํ•จ์ˆ˜
    • map() => ์ผ๋Œ€์ผ ํ•จ์ˆ˜
    • RxJava์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Observable ๋ฐ–์— ์—†์Œ (๋ฐฐ์••(back pressure)์„ ๊ณ ๋ คํ•˜๋ฉด Observable ๋Œ€์‹ ์— Flowable)

3.4_flatMap


3.5 filter() ํ•จ์ˆ˜

  • Observable์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ์—ญํ• 

    • ํ•„์š”์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ œ๊ฑฐํ•˜๊ณ  ์˜ค์ง ๊ด€์‹ฌ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ filter() ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๊ฒŒ ๋จ.
  • Predicate๋ฅผ ์ธ์ž๋กœ ๋„ฃ์Œ (Predicate - ์ง„์œ„ ํŒ๋ณ„์ด๋ผ๋Š” ๋œป, boolean ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค)

    • Map()์€ Function ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋„ฃ์Œ
    • ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Function์ธ์ง€ Predicate์ธ์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋™์ผํ•˜๊ฒŒ ์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์  (๊ตฌ๋ถ„์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€~)
  • Observable source = Observable.fromArray(data).filter(number -> number % 2 ==0 );

  • filter()์™€ ๋น„์Šทํ•œ ํ•จ์ˆ˜๋“ค

    • first(default) : Observable์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ํ•„ํ„ฐ. ๊ฐ’์ด ์—†์ด ์™„๋ฃŒ๋˜๋ฉด ๊ธฐ๋ณธ๊ฐ’ ๋ฆฌํ„ด.
    • last(default) : ๋งˆ์ง€๋ง‰ ๊ฐ’
    • take(N) : ์ตœ์ดˆ N ๊ฐœ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ด.
    • takeLast(N) : ๋งˆ์ง€๋ง‰ N ๊ฐœ ๊ฐ’๋งŒ ํ•„ํ„ฐํ•จ.
    • skip(N) : ์ตœ์ดˆ N ๊ฐ’์„ ๊ฑด๋„ˆ๋œ€.
    • skipLast(N) : ๋งˆ์ง€๋ง‰ N๊ฐœ ๊ฐ’์„ ๊ฑด๋„ˆ๋œ€.
    • ๊ฐ€์žฅ ์œ ์šฉํ•œ ํ•จ์ˆ˜๋Š” take()

3.5_filter


3.6 reduce() ํ•จ์ˆ˜

  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐœํ–‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ทจํ•ฉํ•˜์—ฌ ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ๋•Œ

    • ๋ฐœํ–‰ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ตœ์ข… ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์„ฑํ•  ๋•Œ
  • Maybe source = Observable.fromArray(balls).reduce((ball1,ball2) -> ball2 + โ€(โ€œ + ball1 + โ€œ)โ€ );

    • Observable ์ด ์•„๋‹ˆ๋ผ Maybe

      • Why? : reduce()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ž๋กœ ๋„˜๊ธด ๋žŒ๋‹ค ํ‘œํ˜„์‹์— ์˜ํ•ด ๊ฒฐ๊ณผ ์—†์ด ์™„๋ฃŒ๋  ์ˆ˜๋„ ์žˆ์Œ.
      • ๋”ฐ๋ผ์„œ Observable์ด ์•„๋‹ˆ๋ผ Maybe ๊ฐ์ฒด๋กœ ๋ฆฌํ„ด
  • reduce(BiFunction<T,T,T> reducer) => ์›ํ˜•

    • BiFunction ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์ž๋กœ ํ™œ์šฉ (Function X)
      • BiFunction์ด๋ž€? ์ž…๋ ฅ ์ธ์ž๋กœ 2๊ฐœ์˜ ๊ฐ’์„ ๋ฐ›๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค
      • ๋žŒ๋‹ค์—์„œ ์ธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ๋Š”, ๊ด„ํ˜ธ๋กœ ์ธ์ž์˜ ๋ชฉ๋ก์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด์ค˜์•ผ ํ•จ. Ex) (ball1,ball2) -> ball2 + โ€(โ€œ + ball1 + โ€œ)โ€
    • BiFunction<String, String, String> : ์ธ์ž1, ์ธ์ž2, ๋ฆฌํ„ด ํƒ€์ž… ๋ชจ๋‘ String

3.6_reduce



4. ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž - ํ™œ์šฉ

4.1 ์—ฐ์‚ฐ์ž ๋ถ„๋ฅ˜

์—ฐ์‚ฐ์ž ์ข…๋ฅ˜๊ฐ€ ๋งŽ์•„ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๋‚˜๋ˆ” (ReactiveX ํ™ˆํŽ˜์ด์ง€ ๊ธฐ์ค€)

์ƒ์„ฑ ์—ฐ์‚ฐ์ž just(), fromXXX(), create(), interval(), range(), timer(), intervalRange(), defer(), repeat()
๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž map(), flatMap(), concatMap(), switchMap), groupBy(), scan(), buffer(), window()
ํ•„ํ„ฐ ์—ฐ์‚ฐ์ž filter(), take(), skip(), distinct()
๊ฒฐํ•ฉ ์—ฐ์‚ฐ์ž zip(), combineLatest(), Merge(), concat()
์กฐ๊ฑด ์—ฐ์‚ฐ์ž amb(), takeUntil(), skipUntil(), all()
์—๋Ÿฌ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์ž onErrorReturn(), onErrorResumeNext(), retry(), retryUntil()
๊ธฐํƒ€ ์—ฐ์‚ฐ์ž subscribe(), subscribeOn(), observeOn(), reduce(), count()

4.2 ์ƒ์„ฑ ์—ฐ์‚ฐ์ž

์ƒ์„ฑ ์—ฐ์‚ฐ์ž์˜ ์—ญํ• ์€ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ Observable (Observable, Single, Maybe ๊ฐ์ฒด ๋“ฑ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ

4.2.1 interval()

4.2.1_interval

  • ์ผ์ •์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ƒ์„ฑ

  • ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” Long ๊ฐ์ฒด(๊ธฐ๋ณธํ˜•X, ๋ž˜ํผํด๋ž˜์ŠคO) ๋ฐœํ–‰

  • ํ•จ์ˆ˜ ์›ํ˜• ๋‘๊ฐ€์ง€

    ํ•จ์ˆ˜ ์›ํ˜• ์„ค๋ช… ๋น„๊ณ 
    interval(long period, TimeUnit unit) ์ผ์ • ์‹œ๊ฐ„(period) ์‰ฌ์—ˆ๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰
    interval(long initialDelay, long period, TimeUnit unit) ๋™์ž‘์€ ๊ฐ™๊ณ  ์ตœ์ดˆ ์ง€์—ฐ ์‹œ๊ฐ„(initialDelay)์„ ์กฐ์ ˆ ๋ณดํ†ต ์ดˆ๊ธฐ ์ง€์—ฐ์‹œ๊ฐ„ ์—†์ด(initialDelay๋ฅผ 0์œผ๋กœ) ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
์ฐธ๊ณ  ) SchedulerSupport ์–ด๋…ธํ…Œ์ด์…˜
@SchedulerSupport(SchedulerSupport.COMPUTATION)
  • interval() ํ•จ์ˆ˜์˜ ๋™์ž‘์ด ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ(RxJava์—์„œ ์Šค์ผ€์ค„๋Ÿฌ)์—์„œ ๋™์ž‘

4.2.2 timer()

  • interval()๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
  • ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„, ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  onComplete() ์ด๋ฒคํŠธ ๋ฐœํ–‰

4.2.2_timer


4.2.3 range()

  • ์ฃผ์–ด์ง„ ๊ฐ’ (n) ๋ถ€ํ„ฐ m๊ฐœ์˜ Integer ๊ฐ์ฒด๋ฅผ ๋ฐœํ–‰
    • interval() / timer() ๋Š” Long ๊ฐ์ฒด๋ฅผ ๋ฐœํ–‰ํ–ˆ์ง€๋งŒ range()๋Š” Integer ๊ฐ์ฒด๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฆ„
  • ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰
    • (interval(), timer()์™€ ๋‹ค๋ฅด๊ฒŒ)

4.2.3_range


4.2.4 intervalRange()

  • interval() + range() ๋ฅผ ํ˜ผํ•ฉํ•ด๋†“์€ ํ•จ์ˆ˜

    • interval() ์ฒ˜๋Ÿผ ์ผ์ •์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•˜์ง€๋งŒ
    • range() ์ฒ˜๋Ÿผ ์‹œ์ž‘ ์ˆซ์ž(n)๋กœ ๋ถ€ํ„ฐ m๊ฐœ๋งŒํผ์˜ ๊ฐ’๋งŒ ์ƒ์„ฑํ•˜๊ณ  onComplete์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
      • ์ฆ‰, interval() ์ฒ˜๋Ÿผ ๋ฌดํ•œํžˆ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ฐœํ–‰ํ•˜์ง€ ์•Š์Œ
  • ๋ฆฌํ„ด ํƒ€์ž…์€ interval()ํ•จ์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ Long ํƒ€์ž…

4.2.4_intervalrange

โ€‹

public static Observable<Long> intervalRange 
  (long start, long count, long initialDelay, long period, TimeUnit unit) { }  

์ธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค. ์ฐจ๋ผ๋ฆฌ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์„ ์กฐํ•ฉํ•ด intervalRange() ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Observable<Long> souce = Observable.interval(100L, TimeUnit.MILLISECONDS)
  .map (val -> val+1)
  .take (5);
source.subscribe(Log::i);
CommonUtils.sleep(1000);

4.2.5 defer()

  • timer() ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ƒ์„ฑ์„ ๊ตฌ๋…์ž๊ฐ€ subscribe() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์Œ. ์ด๋•Œ ์ƒˆ๋กœ์šด Observable์ด ์ƒ์„ฑ๋จ

4.2.5_defer


4.2.6 repeat()

  • ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต ์‹คํ–‰์„ ํ•จ.
  • ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ž˜ ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธ(ping, heart beat..) ํ•˜๋Š” ์ฝ”๋“œ์— ์œ ์šฉ

4.2.6_repeat


4.3 ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž

๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๋Š” ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€ํ˜•ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ด ๋˜๋Š” ํ•จ์ˆ˜(map(), flatMap())์™€ ๋น„๊ตํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๊ทธ ์ฐจ์ด์ ์„ ๊ธฐ์–ตํ•˜๋Š”๊ฒŒ ์ข‹์Œ. ์‹ค๋ฌด์— ๋„์›€์ด๋จ


4.3.1 concatMap()

  • flatMap() ๊ณผ ๋น„์Šท
    • flatMap() ์€ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ==> ์ธํ„ฐ๋ฆฌ๋น™(๋ผ์–ด๋“ค๊ธฐ) ๋ผ๊ณ  ํ•จ.
    • But, concatMap()์€ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ƒ„
  • ๊ณ„์‚ฐ ์†๋„๋Š” flatMap()์ด ํ›จ์”ฌ ๋ฐ”๋ฅด๋‹ค
    • ์ด์œ ) ์ธํ„ฐ๋ฆฌ๋น™์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ
    • concatMap() ํ•จ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ฃผ๋ ค๋ฉด ์ถ”๊ฐ€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•จ.

4.3.1_concatMap


4.3.2 switchMap()

  • concatMap() ํ•จ์ˆ˜๊ฐ€ ์ธํ„ฐ๋ฆฌ๋น™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๋™์ž‘์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ค€๋‹ค๋ฉด,

    switchMap() ํ•จ์ˆ˜๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์— ์ง„ํ–‰ ์ค‘์ด๋˜ ์ž‘์—…์„ ๋ฐ”๋กœ ์ค‘๋‹จ

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์ด ๋ฐœํ–‰๋˜์—ˆ์„๋•Œ, ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๊ฐ’๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

    • ์ค‘๊ฐ„์— ๋Š๊ธฐ๋”๋ผ๋„ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๋Š” ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ.

4.3.2_switchmap


4.3.3 groupBy()

  • ์–ด๋–ค ๊ธฐ์ค€(keySelector ์ธ์ž)์œผ๋กœ ๋‹จ์ผ Observable์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ Observable ๊ทธ๋ฃน(GroupedObservable)์œผ๋กœ ๋งŒ๋“ฌ.
    • ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ Observable ๊ฐ๊ฐ์„ ์—ฌ๋Ÿฌ ๊ฐœ Observable์˜ ๊ทธ๋ฃน์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ

4.3.3_groupBy

์ฐธ๊ณ ) map() / flatMap() / groupBy() ํ•จ์ˆ˜์˜ ๋™์ž‘ ๋น„๊ต
  • map() ํ•จ์ˆ˜ - 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์ด๋‚˜ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
  • flatMap() ํ•จ์ˆ˜ - 1๊ฐœ์˜ ๊ฐ’์„ ๋ฐ›์•„์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ(Observable)๋กœ ํ™•์žฅํ•ด์คŒ.
  • groupBy() - ๊ฐ’๋“ค์„ ๋ฐ›์•„์„œ ์–ด๋–ค ๊ธฐ์ค€์— ๋งž๋Š” ์ƒˆ๋กœ์šด Observable ๋‹ค์ˆ˜ ์ƒ์„ฑ

4.3.4 scan()

  • ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ž…๋ ฅ๊ฐ’์— ๋งž๋Š” ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ๋ฐ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐœํ–‰
  • reduce() ํ•จ์ˆ˜์™€ ๋น„์Šท
    • reduce() ๋Š” Observable์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋œ ํ›„ ๊ทธ๊ฒƒ์„ ์ข…ํ•ฉํ•˜์—ฌ ๋งˆ์ง€๋ง‰ 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐœํ–‰ํ•จ.
    • ์ฆ‰, ๋‹ค๋ฅธ ์ ์€ ๋งˆ์ง€๋ง‰ 1๊ฐœ or ์ค‘๊ฐ„๊ฒฐ๊ณผ๊นŒ์ง€ ๊ณ„์† ๋ฐœํ–‰ํ•˜๋ƒ

4.3.4_scan


4.4 ๊ฒฐํ•ฉ ์—ฐ์‚ฐ์ž

๊ฒฐํ•ฉ ์—ฐ์‚ฐ์ž๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ Observable์„ ์กฐํ•ฉํ•˜์—ฌ ํ™œ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.

๋‹ค์ˆ˜์˜ Observable์„ ํ•˜๋‚˜๋กœ ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.


4.4.1 zip()

  • ๊ฐ๊ฐ์˜ Observable์„ ๋ชจ๋‘ ํ™œ์šฉํ•ด 2๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ Observable์„ ๊ฒฐํ•ฉ
    • ์˜ˆ) A,B ๋‘๊ฐœ์˜ Observable์„ ๊ฒฐํ•ฉํ•œ๋‹ค๋ฉด 2๊ฐœ์˜ Observable์—์„œ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ. ๊ทธ์ „๊นŒ์ง€๋Š” ๋ฐœํ–‰์„ ๊ธฐ๋‹ค๋ฆผ

4.4.1_zip


4.4.2 combineLatest()

  • 2๊ฐœ ์ด์ƒ์˜ Observable์„ ๊ธฐ๋ฐ˜์œผ๋กœ Observable ๊ฐ๊ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.
  • ๋‘ Observable ๋ชจ๋‘ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋ฉด ๊ทธ๋•Œ๋Š” ๊ฒฐ๊ด๊ฐ’์ด ๋‚˜์˜ด
    • ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋‘˜ ์ค‘์— ์–ด๋–ค ๊ฒƒ์ด ๊ฐฑ์‹ ๋˜๋˜์ง€ ์ตœ์‹  ๊ฒฐ๊ด๊ฐ’์„ ๋ณด์—ฌ์คŒ(์ด ๋ถ€๋ถ„์ด zip()ํ•จ์ˆ˜์™€ ๋‹ค๋ฆ„)

4.4.2_combineLatest


4.4.3 merge()

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฐํ•ฉํ•จ์ˆ˜ (zip, combineLatest์— ๋น„๊ตํ•˜๋ฉด)
  • ์ž…๋ ฅ Observable์˜ ์ˆœ์„œ์™€ ๋ชจ๋“  Observable์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š”์ง€ ๋“ฑ์— ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ์–ด๋Š ๊ฒƒ์ด๋“  ์—…์ŠคํŠธ๋ฆผ์—์„œ ๋จผ์ € ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐœํ–‰ํ•จ.

4.4.3_merge


4.4.4 concat()

  • 2๊ฐœ ์ด์ƒ์˜ Observable์„ ์ด์–ด ๋ถ™์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜
  • ์ฒซ๋ฒˆ์งธ Observable์— onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ๋‘ ๋ฒˆ์งธ Observable์„ ๊ตฌ๋…ํ•จ. (์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋กœ ์ด์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋งŒ๋งŒ์น˜ ์•Š์„ ๊ฒƒ)
    • ์ฒซ๋ฒˆ์งธ Observabl์— onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด, ๋‘๋ฒˆ ์งธ Observable์€ ์˜์›ํžˆ ๋Œ€๊ธฐ
      • ์ด๋Š” ์ž ์žฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)์˜ ์œ„ํ—˜์„ ๋‚ดํฌํ•จ.
      • ๋”ฐ๋ผ์„œ, ์ž…๋ ฅ Observable์ด ๋ฐ˜๋“œ์‹œ ์™„๋ฃŒ(onComplete ์ด๋ฒคํŠธ)๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•จ.
  • ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” Observable์€ ์ตœ๋Œ€ 4๊ฐœ
  • concat() ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•  ๋•Œ๋Š” onComplete ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ์—ฌ๋ถ€ ํ™•์ธ์ด ์ค‘์š”.

4.4.4_concat


4.5 ์กฐ๊ฑด ์—ฐ์‚ฐ์ž

์กฐ๊ฑด ์—ฐ์‚ฐ์ž๋Š” Observable์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

ํ•„ํ„ฐ ์—ฐ์‚ฐ์ž๋Š” ๋ฐœํ–‰๋œ ๊ฐ’์„ ์ฑ„ํƒํ•˜๋Š๋ƒ ๊ธฐ๊ฐํ•˜๋Š๋ƒ ์—ฌ๋ถ€์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค๋ฉด, ์กฐ๊ฑด ์—ฐ์‚ฐ์ž๋Š” ์ง€๊ธˆ๊นŒ์ง€์˜ ํ๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•  ๊ฒƒ์ธ์ง€์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.


4.5.1 amb()

  • ๋‘˜ ์ค‘ ์–ด๋Š ๊ฒƒ์ด๋“  ๋จผ์ € ๋‚˜์˜ค๋Š” Observable์„ ์ฑ„ํƒํ•จ.
    • ambiguous(๋ชจํ˜ธํ•œ) ๋ผ๋Š” ์˜์–ด ๋‹จ์–ด์˜ ์ค„์ž„๋ง
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Observable ์ค‘์—์„œ 1๊ฐœ์˜ Observable์„ ์„ ํƒํ•˜๋Š”๋ฐ,
    • ์„ ํƒ ๊ธฐ์ค€์€ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” Observable.
    • ์ดํ›„ ๋‚˜๋จธ์ง€ Observable์—์„œ ๋ฐœํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋ฌด์‹œํ•œ๋‹ค.

4.5.1_amb


4.5.2 takeUntil()

  • take() ํ•จ์ˆ˜์— ์กฐ๊ฑด์„ ์„ค์ •
  • ์ธ์ž๋กœ ๋ฐ›์€ Observable์—์„œ ์–ด๋–ค ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋ฉด, ํ˜„์žฌ Observable์˜ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ์ฆ‰์‹œ ์™„๋ฃŒ(onComplete ์ด๋ฒคํŠธ ๋ฐœ์ƒ)
    • ์ฆ‰, take() ์ฒ˜๋Ÿผ ์ผ์ • ๊ฐœ์ˆ˜๋งŒ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋˜, ์™„๋ฃŒ ๊ธฐ์ค€์„ ๋‹ค๋ฅธ Observable์—์„œ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋Š”์ง€๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ.
takeUntil (ObservableSource<U> other)
  • ์ธ์ž๋กœ ๊ฐ’์„ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” other Observable์ด ํ•„์š”ํ•˜๋‹ค.

4.5.2_takeUntil


4.5.3 skipUntil()

  • takeUntil() ๊ณผ ์ •๋ฐ˜๋Œ€ ํ•จ์ˆ˜
  • other Observable ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ’์„ ๊ฑด๋„ˆ ๋œ€.
    • other Observable ์—์„œ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์›๋ž˜ Observable์—์„œ ๊ฐ’์„ ์ •์ƒ์ ์œผ๋กœ ๋ฐœํ–‰ํ•˜๊ธฐ ์‹œ์ž‘

4.5.3_skipUntil


4.5.4 all()

  • ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— 100% ๋งž์„ ๋•Œ๋งŒ true ๊ฐ’์„ ๋ฐœํ–‰
    • ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ๋ฐ”๋กœ false ๊ฐ’์„ ๋ฐœํ–‰
Single<Boolean> all (Predicate<? super T> predicate)
  • predicate ์ธ์ž๋Š” filter() ํ•จ์ˆ˜์˜ ์ธ์ž์™€ ๋™์ผ

  • ์ฃผ์–ด์ง„ ๋žŒ๋‹ค๊ฐ€ true์ธ์ง€ false ์ธ์ง€ ํŒ์ •ํ•ด์คŒ.

4.5.4_all


4.6 ์ˆ˜ํ•™ ๋ฐ ๊ธฐํƒ€ ์—ฐ์‚ฐ์ž

4.6.1 ์ˆ˜ํ•™ ํ•จ์ˆ˜

  • RxJava์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ™•์žฅ ๋ชจ๋“ˆ์ด ์กด์žฌํ•œ๋‹ค. (RxAndroid, RxNetty, RxApacheHttp๋“ฑ)
    • RxJava1 => ์ˆ˜ํ•™ํ•จ์ˆ˜ ๋ชจ์€ RxJavaMath ๊ฐ€ ์žˆ์Œ.
    • RxJava2 => RxJavaMath ์ง€์›์•ˆ๋จ. โ€”> ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
  • RxJava2์˜ ํ•ต์‹ฌ ์ปค๋ฏธํ„ฐ์ธ ๋ฐ์ด๋น— ์นด๋ฅด๋…น์ด ๋งŒ๋“  RxJava2Extensions ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

4.6.1.1 count()

  • Single< Long> count()
  • Observable์—์„œ ๋ฐœํ–‰ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐœํ–‰
  • ๊ฒฐ๊ณผ๊ฐ€ 1๊ฐœ ๊ฐ’์ด๋ฏ€๋กœ Single< Long>์„ ๋ฐœํ–‰
Integer[] data = {1,2,3,4,7};

Single<Long> source = Observable.fromArray(data)
  .count();
source.subscribe(count -> Log.i("count >> " + count));

// [์ถœ๋ ฅ] count >> 5

4.6.1.2 max() / min()

  • Flowable max(Publisher source)
  • Flowable min(Publisher source)
Integer[] data = {1,2,3,4,7};

Floawable.fromArray(data)
  .to(MathFlowable::max)
  .subscribe(max -> Log.i("max >> " + max));

// [์ถœ๋ ฅ] max >> 7

4.6.1.3 sum() / average()

  • sum()๊ณผ average()๋Š” ๊ฐ๊ฐ ์•„๋ž˜์ฒ˜๋Ÿผ sumInt(), averageDouble() ์ฒ˜๋Ÿผ ์ธ์ž ํƒ€์ž…์ด ํ•จ์ˆ˜ ์ด๋ฆ„์— ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜๋˜์–ด ์žˆ์Œ. (์›ํ•˜๋Š” ํƒ€์ž… ๊ณจ๋ผ ์‚ฌ์šฉ)
  • Flowable sumInt(Publisher source)
  • Flowable averageDouble(Publisher<? extends Number> source)
Integer[] data = {1,2,3,4,7};

Flowable<Integer> flowable = Flowable.fromArray(data)
  .to(MathFlowable::sumInt);
flowable.subscribe(sum -> Lob.i("sum >> " + sum));

// [์ถœ๋ ฅ] sum >> 17

4.6.2 delay()

  • ๋‹จ์ˆœํ•˜๊ฒŒ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š” time๊ณผ ์‹œ๊ฐ„๋‹จ์œ„(TimeUnit)๋งŒํผ ์ž…๋ ฅ๋ฐ›์€ Observable์˜ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰์„ ์ง€์—ฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• 
    • Observable delay (long delay, TimeUnit unit)
  • Interval()๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์‹คํ–‰.

4.6.2_delay


4.6.3 timeInterval()

  • ์–ด๋–ค ๊ฐ’์„ ๋ฐœํ–‰ํ–ˆ์„ ๋•Œ ์ด์ „ ๊ฐ’์„ ๋ฐœํ–‰ํ•œ ์ดํ›„ ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ํ˜๋ €๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.

4.6.4_timeInterval



5. ์Šค์ผ€์ค„๋Ÿฌ

5.1 ์Šค์ผ€์ค„๋Ÿฌ ๊ฐœ๋…

์Šค์ผ€์ค„๋Ÿฌ๋Š” RxJava์˜ ํ•ต์‹ฌ ์š”์†Œ๋กœ Observable ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค.

  • ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ.

  • ์ง€๊ธˆ๊นŒ์ง€ ์ž๋ฐ”๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ์ž๋ฐ” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด๋‚˜ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค๋ฉด ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋†€๋ž„ ๊ฒƒ!! (๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋กœ ๋‹ค์‹œ ํƒ„์ƒ!!)

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

  • subscribeOn() ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœํ•˜๋ฉด Observable์˜ ๋ชจ๋“  ํ๋ฆ„์ด ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋จ

  • ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ(main) ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘์„ ์‹คํ–‰


5.2 ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ข…๋ฅ˜

  • RxJava๋Š” ๋‹ค์–‘ํ•œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ œ๊ณต.
  • ์ƒํ™ฉ์— ๋งž๊ฒŒ ์–ด๋–ค ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€
  • RxJava ๋ฉ‹์ง„ ์  : ํŠน์ • ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์›€
    • ๋งˆ์น˜ map() ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๋” ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒˆ๋กญ๊ฒŒ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

5.2.1 ๋‰ด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ

  • ์ด๋ฆ„์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
  • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์–ด๋–ค ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ Schedulers.newThread() ๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋จ.
    • ๊ทธ๋Ÿผ ๋‰ด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
  • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ํ•˜์ง€๋งŒ, ์ ๊ทน์ ์œผ๋กœ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹˜.
      • RxJava์—๋Š” ์ด๊ฑฐ๋ณด๋‹ค ํ™œ์šฉ๋„๊ฐ€ ๋†’์€ ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์™€ IO ์Šค์ผ€์ค„๋Ÿฌ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ.

RxJava์—์„œ ์ถ”์ฒœํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€
  • 1.๊ณ„์‚ฐ(Computation) ์Šค์ผ€์ค„๋Ÿฌ / 2. IO ์Šค์ผ€์ค„๋Ÿฌ / 3. ํŠธ๋žจํŽ„๋ฆฐ ์Šค์ผ€์ค„๋Ÿฌ
  • ๋‰ด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ์—์„œ ์ ์šฉํ•˜๊ธธ ๊ถŒ์žฅ

5.2.2 ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ

  • CPU์— ๋Œ€์‘ํ•˜๋Š” ๊ณ„์‚ฐ์šฉ ์Šค์ผ€์ค„๋Ÿฌ

  • '๊ณ„์‚ฐ' ์ž‘์—…์„ ํ•  ๋•Œ๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์ด ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”.

    • ๊ณ„์‚ฐ ์ž‘์—…์ด ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋ฉด => ์ž…์ถœ๋ ฅ(I/O) ์ž‘์—…์„ ํ•˜์ง€ ์•Š๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ํ’€์„ ์ƒ์„ฑ

    .subscribeOn (Schedulers.computatioin())


5.2.3 IO ์Šค์ผ€์ค„๋Ÿฌ

  • ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋„คํŠธ์›Œํฌ์ƒ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ์ข… ์ž…,์ถœ๋ ฅ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šค์ผ€์ค„๋Ÿฌ
    • ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ์™€ ๋‹ค๋ฅธ ์  : ๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ
      • ์ฆ‰, ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” CPU ๊ฐœ์ˆ˜๋งŒํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ,
      • IO ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ„์† ์ƒ์„ฑํ•จ.
    • ๊ณ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ => ์ผ๋ฐ˜์ ์ธ ๊ณ„์‚ฐ ์ž‘์—…
    • IO ์Šค์ผ€์ค„๋Ÿฌ => ๋„คํŠธ์›Œํฌ์ƒ์˜ ์š”์ฒญ, ํŒŒ์ผ ์ž…์ถœ๋ ฅ, DB ์ฟผ๋ฆฌ ๋“ฑ
  • .subscribeOn (Schedulers.io())
String root ="C:\\";
File[] files = new File(root).listFiles();

Observable<String> source = Observable.fromArray(files)
  .filter(f -> !f.isDirectory)
  .map(f -> f.getAbsolutePath())
  .subscribeOn(Schedulers.io());

source.subscribe(Log::i);
  • source๋ณ€์ˆ˜๋Š” File[] ๋ฐฐ์—ด์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” Observable => IO ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์‹คํ–‰๋จ

5.2.4 ํŠธ๋žจํŽ„๋ฆฐ ์Šค์ผ€์ค„๋Ÿฌ

  • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๋ฌดํ•œํ•œ ํฌ๊ธฐ์˜ ๋Œ€๊ธฐ ํ–‰๋ ฌ(Queue)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ
    • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๋Œ€๊ธฐ ํ–‰๋ ฌ์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค๋Š” ๊ฒƒ์ด ๋‰ด ์Šค๋ ˆ๋“œ, ๊ณ„์‚ฐ, IO ์Šค์ผ€์ค„๋Ÿฌ์™€ ๋‹ค๋ฅด๋‹ค.
  • ์ƒ์„ฑ๋ฐฉ๋ฒ• : .subscribeOn (Schedulers.trampoline())

5.2.5 ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ

  • RxJava ๋‚ด๋ถ€์—์„œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์—ฌ ๊ตฌ๋…(subscribe) ์ž‘์—…์„ ์ฒ˜๋ฆฌ.
  • But, ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ™œ์šฉํ•  ํ™•๋ฅ ์€ ๋‚ฎ๋‹ค.
  • ์ƒ์„ฑ๋ฐฉ๋ฒ• : .subscribeOn (Schedulers.single())

5.2.6 Executor ๋ณ€ํ™˜ ์Šค์ผ€์ค„๋Ÿฌ

  • ์ž๋ฐ”์—์„œ๋Š” java.util.current ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹คํ–‰์ž(Executor)๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.
  • ํ•˜์ง€๋งŒ Executor ํด๋ž˜์Šค์™€ ์Šค์ผ€์ค„๋Ÿฌ์˜ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ถ”์ฒœ๋ฐฉ๋ฒ•์€ ์•„๋‹˜
    • ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Executor ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ๋•Œ๋ฌธ ํ•œ์ •์ ์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค.
  • ์ƒ์„ฑ๋ฐฉ๋ฒ• : .subscribeOn (Schedulers.from(executor))

5.3 onserveOn() ํ•จ์ˆ˜์˜ ํ™œ์šฉ

RxJava ์Šค์ผ€์ค„๋Ÿฌ์˜ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ ์ œ๊ณต๋˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ข…๋ฅ˜๋ฅผ ์„ ํƒํ•œ ํ›„ subscribeOn() ๊ณผ observeOn() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

subscribeOn() : Observable์—์„œ ๊ตฌ๋…์ž๊ฐ€ subscribe() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ฐœํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์ •

  • ์ฒ˜์Œ ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ ์ •์‹œํ‚ค๋ฏ€๋กœ ๋‹ค์‹œ subscribeOn() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋ฌด์‹œ. (ํ•˜์ง€๋งŒ, observeOn() ํ•จ์ˆ˜๋Š” ๋‹ค๋ฆ„)

observeOn() : ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ง€์ •.

  • ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜ธ์ถœ๋˜๋ฉด ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ๋™์ž‘ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
  • ์ „ํ†ต์ ์ธ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ผ์ผ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถ€๋‹ด์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํž˜๋“ฌ.
    • ํ•˜์ง€๋งŒ, observeOn() ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ ๋ณ€๊ฒฝ์ด ์‰ฌ์šฐ๋ฏ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๋„“์Œ



6. ๋งˆ๋ฌด๋ฆฌ

6.1 ์†Œ๊ฐ

์ด๋ฒˆ ๋ฐœํ‘œ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ RxJava์˜ ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ˆ˜์‹ญ๊ฐœ์˜ ์—ฐ์‚ฐ์ž์™€, Observable, Single, Maybe์™€ ์Šค์ผ€์ค„๋Ÿฌ ๋“ฑ ๋งŽ์€ ๊ฐœ๋…๋“ค์„ ๊ณต๋ถ€ํ•˜์˜€๋‹ค. RxJava์˜ ์ „๋ฐ˜์ ์ธ ์ด๋ก  ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•œ ๊ฒƒ ๊ฐ™์•„ ์ด์ œ๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋ฉด์„œ ํ™•์‹คํžˆ ์ดํ•ดํ• ๊ฒƒ์ด๋‹ค. ์ง์ ‘ ์ฝ”๋“œ์— Rx๋ฅผ ์ ์šฉํ•ด ๊ธด์ฝ”๋“œ๊ฐ€ ์งง์•„์ง€๋Š” ๋งค์ง~๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ํŠนํžˆ Rerofit์„ ์ด์šฉํ•œ ์„œ๋ฒ„ํ†ต์‹ ์„ Rx๋ฅผ ์ ์šฉ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.


6.2 ์ถœ์ฒ˜

๋„์„œ

  • RxJava ํ”„๋กœ๊ทธ๋ž˜๋ฐ (์œ ๋™ํ™˜, ๋ฐ•์ •์ค€ ์ง€์Œ)

์›นํŽ˜์ด์ง€