[RxJava] 3. Reactive ์ฐ์ฐ์ ํํค์ณ๋ณด๊ธฐ 1ํธ (์์ฑ, ๋ณํ ์ฐ์ฐ์)
์ง๋ ํฌ์คํธ์์ 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