[RxJava] 3. Reactive ์—ฐ์‚ฐ์ž ํŒŒํ—ค์ณ๋ณด๊ธฐ 1ํŽธ (์ƒ์„ฑ, ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž)

๋ฐ˜์‘ํ˜•

2021/01/23 - [Programming/Java] - [RxJava] 2. Reactive ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž(Operator) - map, filter, reduce

 

[RxJava] 2. Reactive ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž(Operator) - map, filter, reduce

Reactive Programming์—์„œ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” Reactive Operator์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด Java 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ Reactive ์—ฐ์‚ฐ์ž๊ฐ€ ๋งค์šฐ ์ต์ˆ™ํ•˜์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. RxJava์—.

blog.neonkid.xyz

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ Reactive์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ RxJava์—์„œ ์ œ๊ณตํ•˜๋Š” ์ˆ˜๋งŽ์€ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๊ณ  ๊ทธ ์ค‘์— ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ์ž๊ฐ€ map, filter, reduce๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” RxJava์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” 4๊ฐ€์ง€ ์—ฐ์‚ฐ์ž์ธ ์ƒ์„ฑ, ๋ณ€ํ™˜, ๊ฒฐํ•ฉ, ์กฐ๊ฑด ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ  ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๋Š” ์‹œ๊ฐ„์„ 1๋ถ€์™€ 2๋ถ€๋กœ ๋‚˜๋ˆ„์–ด ์ „๊ฐœ๋ฅผ ํ•˜๋„๋ก ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ 1๋ถ€์—์„œ๋Š” ์ƒ์„ฑ๊ณผ ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ฃ .

 

 

 

 

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

์ƒ์„ฑ ์—ฐ์‚ฐ์ž์˜ ํ•ต์‹ฌ์€ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ RxJava์—์„œ๋Š” Observable, Single ๋“ฑ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ๋ณดํ†ต Java์—์„œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•  ๋•Œ๋Š” new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RxJava์—์„œ๋Š” new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ , just ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ํ˜•ํƒœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šคํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ์„ฑ ์—ฐ์‚ฐ์ž๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ด ์™ธ์—๋„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž, ํŠน์ • ์‹œ๊ฐ„์— ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž ๋“ฑ create, just ์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€ ์ง€์—ฐ์„ ๋‘๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์—ฐ์‚ฐ์ž๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

interval()

 

interval ์—ฐ์‚ฐ์ž๋Š” ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ…Œ๋ฉด ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ ์ž ํ•  ๋•Œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

  • ์ผ์ •ํ•œ ์‹œ๊ฐ„ ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ƒ์„ฑ
  • Java์˜ Generic์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Primitive type์ด ์•„๋‹Œ Reference Class ์‚ฌ์šฉ
ํ•จ์ˆ˜ ์›ํ˜• ์„ค๋ช…
interval(long period, TimeUnit unit) ์ผ์ • ์‹œ๊ฐ„(period) ์ง€์—ฐ๋˜์—ˆ๋‹ค ๋ฐ์•„ํ„ฐ ๋ฐœํ–‰
interval(long initialDelay, long period, TimeUnit unit) ์œ„ ๋ฉ”์†Œ๋“œ์™€ ๋™์ž‘์€ ๊ฐ™์œผ๋‚˜ ์ตœ์ดˆ ์ง€์—ฐ ์‹œ๊ฐ„๋งŒ ์กฐ์ ˆ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

์ž์„ธํžˆ ๋ณด๋ฉด ๋‘ ๋ฒˆ์งธ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์†Œ๋“œ์™€ ๋‹ค๋ฅด์ง€ ์•Š์€๋ฐ, ์ฒซ ๋ฒˆ์งธ ๋ฐœํ–‰์—๋งŒ ์ฆ‰์‹œ ๋ฐœํ–‰์„ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ๋ฉ”์†Œ๋“œ๋ฅผ ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@SchedulerSupport(SchedulerSupport.COMPUTATION)

interval ๋ฉ”์†Œ๋“œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด SchedulerSupport๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š”๋ฐ, ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ interval ๊ฐ„๊ฒฉ์„ ์ฃผ์–ด์ฃผ๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ interval ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋Œ์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

timer()

 

timer ์—ฐ์‚ฐ์ž๋Š” interval๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„, ๋‹จ ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐœํ–‰ํ•˜๊ณ  ์ข…๋ฃŒ๊ฐ€ ๋˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

 

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

timer ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ๋„ ์—ญ์‹œ Scheduler๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ interval, timer ๋ฉ”์†Œ๋“œ ๋ชจ๋‘ ๊ณตํ†ต์ ์ด ํ•œ ๊ฐ€์ง€ ๋” ์žˆ๋Š”๋ฐ์š”.

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

 

 

 

range()

 

range ์—ฐ์‚ฐ์ž๋Š” ์ฃผ์–ด์ง„ ๊ฐ’ n ๋ถ€ํ„ฐ m ๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•ด์ฃผ๋Š” ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ น interval์ด๋‚˜ timer์—์„œ๋Š” Long ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด range๋Š” Integer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์ฃผ์–ด์ค๋‹ˆ๋‹ค.

 

timer, interval ์—ฐ์‚ฐ์ž์™€์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด range ์—ฐ์‚ฐ์ž๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ์—ฐ์‚ฐ์ž๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ง์ ‘ ์Šค์ผ€์ค„๋งํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 

SchedulerSupport ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณด๋‹ค์‹œํ”ผ ๋ณ„๋„์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” NONE์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด ์—ฐ์‚ฐ์ž๋Š” ์ง€์—ฐ ๋ฐœํ–‰์„ ์œ„ํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋‹จ์ˆœํžˆ ํŠน์ • ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๋ฐ ๊ทธ ๋ชฉ์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋˜ ํ•œ ๊ฐ€์ง€, range์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด int์ธ ๊ฒƒ์ธ๋ฐ, long์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณ„๋„๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

rangeLong ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ๋” ํฐ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

intervalRange()

 

interval + range ์—ฐ์‚ฐ์ž๋ฅผ ํ˜ผํ•ฉํ•œ ์—ฐ์‚ฐ์ž๋กœ์จ ์ง€์—ฐ๋œ ๋ฐœํ–‰๊ณผ ๋ฒ”์œ„ ๋ฐœํ–‰์„ ๋™์‹œ์— ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ฐธ๊ณ ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. interval์ด ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌดํ•œํžˆ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. range์—์„œ ์ง€์ •ํ•ด์ค€ ๋ฒ”์œ„๋งŒํผ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐœํ–‰๋œ ๋’ค์—๋Š” onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ˆœ๊ฐ„ ์ •์ง€ ๋ฉ๋‹ˆ๋‹ค.

interval, timer์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Scheduler๋ฅผ RxJava์˜ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

defer()

 

defer ์—ฐ์‚ฐ์ž๋Š” timer์™€ ๊ทธ ๊ธฐ๋Šฅ์ด ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ์˜ํ•œ ์ƒ์„ฑ์„ ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋… ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€๋กœ ์‹œ์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๋•Œ ์ƒˆ๋กœ์šด Observable ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

 

create์™€ just์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ด๋“ค ๋‘˜์€ ๋ฐ”๋กœ JVM์— Observable ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์œ„์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ defer๋Š” ๊ตฌ๋…์ž๊ฐ€ subscribe ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌ๋… ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” JVM์— Observable ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ์„ ์ผ์ ˆ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

์•„๋งˆ ์ด๋ ‡๊ฒŒ ์ด์•ผ๊ธฐ ํ•œ๋‹ค๋ฉด defer๋Š” subscribe ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค Observable ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น„์šฉ์ด ํด ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜์‹ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. defer๋Š” 1์ดˆ ์ •๋„ ๋”œ๋ ˆ์ด๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ—ค๋น„ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆด ๊ฒƒ์ด๋ผ๋Š” ์˜ˆ์ƒ๋„ ํ•˜๊ฒ ์ง€๋งŒ ์–ด์ฐจํ”ผ stream ์—ฐ์‚ฐ ์ž์ฒด์˜ ๋”œ๋ ˆ์ด๋กœ ์ธํ•˜์—ฌ ๊ทธ๋‹ค์ง€ ๋งŽ์€ ์ฐจ์ด๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

(์™œ๋ƒํ•˜๋ฉด getHeavyData ๋“ฑ์˜ ์—ฐ์‚ฐ์€ UpStream Thread๋ผ๋Š” ๋ณ„๋„์˜ I/O ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

 

์˜คํžˆ๋ ค ์žฅ์ ์œผ๋กœ ๋ณธ๋‹ค๋ฉด create์™€ just์˜ ๊ฒฝ์šฐ onNext, onCompleted, onError ๋“ฑ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ํ˜ธ์ถœ์„ ์ •์˜ํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ์ด๋“ค์˜ ์ฝœ๋ฐฑ์ด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์˜คํžˆ๋ ค defer ๋ฉ”์†Œ๋“œ๊ฐ€ ๋” ๋‚˜์€ ํšจ๊ณผ๋ฅผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

repeat()

 

repeat ์—ฐ์‚ฐ์ž๋Š” ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต์„ ์œ„ํ•œ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ฐ„๋‹จํžˆ RxJava๋ฅผ ์ด์šฉํ•˜์—ฌ HealthCheck ๊ธฐ๋Šฅ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์ฃผ๊ธฐ์ ์œผ๋กœ ping ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

repeat ์—ฐ์‚ฐ์ž๋Š” ํŠน๋ณ„ํ•œ ์ธ์ž ์ฝ”๋“œ ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ repeat ๋ฉ”์†Œ๋“œ๋Š” repeat(2) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ •ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Long์˜ ์ตœ๋Œ€๊ฐ’๊นŒ์ง€๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

 

 

 

 

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

๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๋Š” ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž์ธ map์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Œ์„ ์ž์œ ์ž์žฌ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, map์€ flatMap ๋“ฑ ์—ฌ๋Ÿฌ ํŒŒ์ƒ๋œ ํ˜•ํƒœ๊ฐ€ ๋งŽ์€๋ฐ,๊ทธ ์ค‘์—์„œ๋„ flatMap์€ Java 8์˜ Stream์—์„œ๋„ ์ž์ฃผ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ, RxJava์— ์žˆ๋Š” flatMap๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ RxJava์—์„œ๋Š” concatMap์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

concatMap()

 

concatMap์€ flatMap๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. flatMap์€ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฌ๋Š” ์ผ์ข…์˜ ์ธํ„ฐ๋ฆฌ๋น™(๋ผ์–ด๋“ค๊ธฐ) ํ˜„์ƒ์„ ํฌํ•จํ•˜๋Š” map ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ concatMap์€ ์ธํ„ฐ๋ฆฌ๋น™ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€ ์•Š์€ ๋Œ€์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ•˜๋”๋ผ๋„ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ณต๊ต๋กญ๊ฒŒ๋„ flatMap์ด ๊ณ„์‚ฐ ์†๋„๋Š” ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”? 

 

concatMap์€ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„์— ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ๊ฒƒ์ด ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ์ธ์ง€๋ฅผ ๋งž์ถฐ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— flatMap๋ณด๋‹ค๋Š” concatMap์˜ ์—ฐ์‚ฐ์ด ์†๋„๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

switchMap()

 

concatMap์ด ์ธํ„ฐ๋ฆฌ๋น™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋ผ๋ฉด switchMap์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”๋˜๋ฉด ๋ณ€ํ™˜ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋Š” ์ข€ ์–ด๋งˆ๋ฌด์‹œํ•œ ๋…€์„์ž…๋‹ˆ๋‹ค.

 

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

 

๊ฐ€๋ น ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒ€์ƒ‰์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์„ ์ž์Œ, ๋ชจ์Œ, ์•ŒํŒŒ๋ฒณ์„ ์ถœ๋ ฅํ•˜์—ฌ ์ž…๋ ฅ์„ ํ•˜๋Š”๋ฐ ์‹ค์‹œ๊ฐ„ ์กฐํšŒ๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„๋งˆ๋‹ค ์ฟผ๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์•„์ง ์‘๋‹ต ๋ฐ›์ง€ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์‹œํ•˜๊ณ  ์ตœ๊ทผ์— ์š”์ฒญํ•œ ๊ฒ€์ƒ‰์–ด๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์—ฐ์‚ฐ์ž๋กœ ์œ ์šฉํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

ํŠน์ดํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— switchMap ๋งŒํผ์€ ๊ทธ ๊ธฐ๋Šฅ์„ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

 

 

 

groupby()

 

์ผ์ • ๊ธฐ์ค€์œผ๋กœ ๋‹จ์ผ Observable์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ Observable ๊ทธ๋ฃน(GroupObservable)์œผ๋กœ ๋งŒ๋“œ๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. Iterable๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

Iterable์€ ํ•˜๋‚˜์˜ Observable ๊ฐ์ฒด๋กœ Iterable ํด๋ž˜์Šค๋ฅผ ๊ฐ์‹ธ๋Š” ๋…€์„์ด๋ผ๋ฉด groupby๋ฅผ ํ†ตํ•ด์„œ ๋‚˜์˜ค๋Š” GroupedObservable์€ ์‹ค์ œ ๋‹จ์ผ Observable ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค์‹œํ”ผ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด GroupedObservable์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด๋Š” Map๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ Key, Value๋ผ๋Š” ์ œ๋„ค๋ฆญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. keyselector๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น Key๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ value๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

 

 

scan()

 

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

 

์›๋ณธ ๋ฐ์ดํ„ฐ์ธ ๋นจ๊ฐ„์ƒ‰์„ ์ž…๋ ฅํ•˜๊ณ  ์ค‘๊ฐ„์— ์—ฐ์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ฐจ๋ก€์ฐจ๋ก€๋กœ ๊ณ„์† ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ๊ฒฐ๊ณผ(ํŒŒ๋ž€์ƒ‰)์„ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

reduce์™€ ๋˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค์‹œํ”ผ Maybe ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , Observable ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. reduce์˜ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๊ฐ€ NULL์ด๊ฑฐ๋‚˜ ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ํ˜น์€ onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๊ตฌ๋…์ž์—๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” NULL-safety ์ฒ˜๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ฐ˜๋ฉด, scan์€ ๊ฐ’์ด ์ž…๋ ฅ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค‘๊ฐ„์—์„œ ๊ฒฐ๊ณผ๊นŒ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— NULL ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์ฃ .

 

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•œ ์œ„์˜ reduce ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋งŒ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ์ „๋ถ€ ๋”ํ•ด์„œ [9, 9]๊ฐ€ ๋‚˜์˜ค๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

 

์ด ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ๋ฉ”์†Œ๋“œ๋งŒ scan์œผ๋กœ ๋ฐ”๊ฟ”๋ด…์‹œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด์— ์ ํ˜€์ ธ ์žˆ๋Š” Point ์ขŒํ‘œ๋ณ„๋กœ ์—ฐ์‚ฐํ•œ ์ค‘๊ฐ„ ๊ฐ’์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ 0,0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋”ํ•˜๋Š” ๊ณผ์ •์ด ๋ณด์ด๊ธฐ๋„ ํ•˜๋ฉฐ ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ณณ์— ์ ์ •ํ•œ ์—ฐ์‚ฐ์ž๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋‹ค์Œ ํฌ์ŠคํŠธ์— ์ด์–ด์„œ 2ํŽธ(๊ฒฐํ•ฉ, ์กฐ๊ฑด ์—ฐ์‚ฐ์ž)์„ ์ด์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

์ฐธ๊ณ (์ด๋ฏธ์ง€): https://reactivex.io/documentation

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments