CHAPTER 8. Reactive Programming
Call me maybe
์ต๊ทผ์๋ ๋ฐ์ ํ ๋๋ ๊ธฐ๋ฅ ํ ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ค์ด ๋ณด์ จ์ ๊ฒ์ด๋ค. Reactive Extensions ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ์๋ .Net๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์ธ์ด๋ก ๋ ํ๋ซํผ์์ ๊ฝค ์ ๋ช ํด์ก์ผ๋ฉฐ ์ด์ ๋ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด (RxJava, RxJS ๋ฑ)์์ ์ฌ์ฉํ ์ ์๋ค.
๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์๋ก์ด ๊ฒ์ด ์๋๋ค. ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์ ์ํ๊ณ ์ด์ ๋์ํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ๋ ์์ฑ, ํํฐ๋ง, ๊ทธ๋ฃนํ ๋ฑ์ ์์ ์ ํ ์ ์๋ค. ์ง๋, ํํฐ, ๊ทธ๋์ ... ๋๋๋ก "๊ธฐ๋ฅ์ ๋ฐ์ ํ ํ๋ก๊ทธ๋๋ฐ"์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฐพ๋ ์ด์ ์ด๋ค. ํ์ง๋ง, ๋ฐ์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ ํ๋ก๊ทธ๋๋ฐ์ด ์๋๋ค. ๋ถ๋ณ์ฑ, ๋ถ์์ฉ์ ๊ฒฐ์ฌ ๋ฑ์ ๊ฐ๋ ์ ๋ฐ๋์ ํฌํจํ์ง๋ ์๋๋ค. ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ๊ฒ์ ๋น์ ๋ ํ ์์๋ ์ผ์ด๋ค.
โข ๋ธ๋ผ์ฐ์ ์์๋ ์ฌ์ฉ์ ์ด๋ฒคํธ์ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ ๋ โข ๋ฐฑ์๋ ์ชฝ์์๋ ๋ฉ์์ง ๋ฒ์ค์์ ์ค๋ ์ด๋ฒคํธ์ ๋ฐ์ํ ๋
๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ค์ด์ค๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์คํธ๋ฆผ์ ์๊ฒ ๋๋ค. ์ด๋ฌํ ์คํธ๋ฆผ์ ๋ฌผ๋ก (ํํฐ๋ ๋ฐ์ดํฐ, ๋ณํฉ๋ ๋ฐ์ดํฐ ๋ฑ) ์์ ๋ ์ ์์ผ๋ฉฐ, ๋ค์ ์ ์๋ ์๋ก์ด ์คํธ๋ฆผ์ด ๋ ์๋ ์๋ค. ๋ฉ์๋ ํธ์ถ์ ๊ฒฐ๊ณผ์ ๋ํด ํฌ๊ฒ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค. ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํค๋ฉด ์ด ๋น์ฆ๋์ค์ ๊ด์ฌ์๋ ์ฑ์ ๋ชจ๋ ๋ถ๋ถ์ด ์ ์ ํ๊ฒ ๋ฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง ์ด ๋ถ๋ถ๋ค ์ค ํ๋๊ฐ ์ด๋ฒคํธ๋ก ์ฌ๋ฆด ๊ฒ์ ๋๋ค.
Angular 2์ ๊ด๋ จ๋ ๋ด์ฉ์ธ๊ฐ?
Angular 2๋ ๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์ด ์์ผ๋ฉฐ, ์ผ๋ถ ๋ถ๋ถ์์๋ ์ด ๊ธฐ์ ์ ์ฌ์ฉ๋๋ค. HTTP ์์ฒญ์ ๋ฐ์ํ๊ณ ์๋๊ฐ? ๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ. ๊ตฌ์ฑ ์์์ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋๊ฐ? ๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ. ์์์ ๊ฐ์น์ ๋ณํ๋ฅผ ๋ค๋ฃจ๋๊ฐ? ๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ
์ด ์ฃผ์ ์ ๋ํด์ ๋์ฑ ์ง์คํ ๊ฒ์ด๋ค. ๋ค๋ฃจ๊ธฐ๊ฐ ํ๋ค์ง๋ ์์ง๋ง ์ด ๋ฌธ์ ์ ๋ํด ๋ช ํํ ์ดํด๋ฅผ ํ๋๊ฒ์ ์ค์ํ๋ค.
General principles
๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ชจ๋ ๊ฒ์ด ์คํธ๋ฆผ์ด๋ค. ์คํธ๋ฆผ์ ์์๊ฐ ์ง์ ๋ ์ด๋ฒคํธ ์ํ์ค์ด๋ค. ์ด ์ด๋ฒคํธ๋ ๊ฐ (๋ชจ์, ๋ค๋ฅธ ๊ฐ!), ์ค๋ฅ (์๋ชป๋จ) ๋๋ ์๋ฃ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ธ๋ค. ์ด ๋ชจ๋ ๊ฒ์ ๋ฐ์ดํฐ ์์ฑ์์์ ์๋น์๋ก ํธ์๋๋ค. ๊ฐ๋ฐ์๋ ์ธ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์ฒ๋ฆฌ ํ ์ ์๋ ๋ฆฌ์ค๋๋ฅผ ์ ์ํ๋ ๋ฑ ์ด๋ฌํ ์คํธ๋ฆผ์ ๊ตฌ๋ ํด์ผํ๋ค. ๊ทธ๋ฐ ์ฒญ์ทจ์๋ ๊ด์ธก์, ๊ด์ธก ๊ฐ๋ฅํ ๊ด์ธก์๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ด ์ฉ์ด๋ ์ค๋์ ์ ๋ง๋ค์ด ์ก๋๋ฐ, ์ ์๋ ค์ง ๋์์ธ ํจํด ์ธ ์ต์๋ฒ ํจํด ์ด๋ค.
๋ ๋ค ๋น๋๊ธฐ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋น์ทํ๊ฒ ๋ณด์ผ์ง๋ผ๋ ์ฝ์๊ณผ ๋ค๋ฅด๋ค. ๊ทธ๋ฌ๋ ๊ด์ฐฐ์๋ ์ฝ์๊ณผ ๊ฐ์ ์ผํ์ฑ์ด ์๋๊ณ '์๋ฃ'์ด๋ฒคํธ๋ฅผ ์์ ํ ๋๊น์ง ๊ณ์ ๊ฐ์ง ํ๊ณ ์๋ค.
ํ์ฌ Observables๋ ๊ฐ๋ฅ ํญ๋ชฉ์ ๊ณต์ ECMAScript ์ฌ์์ ์ผ๋ถ๋ ์๋์ง๋ง, ํ์คํ๋ฅผ ์ํ ๋ ธ๋ ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํฅํ ๋ฒ์ ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ด๋ค.
Observables๋ ๋ฐฐ์ด๊ณผ ์ ์ฌํ๋ค. ๋ฐฐ์ด์ ๊ด์ธก ๊ฐ๋ฅํ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ์ ์งํฉ์ด๋ผ๊ณ ํ ์ ์๋ค. ๊ด์ธก ๊ฐ๋ฅ (observable)์ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๊ฐ์ ๊ฐ๋ ๋ง ์ถ๊ฐ๋๋ค. ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ํ๋ฒ์ ๊ฐ์ง๋ง ๊ฐ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ด์ฐฐ ํ ์ ์๋ค.
JavaScript์์ ๊ฐ์ฅ ์ธ๊ธฐ์๋ ๋ฐ์ ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ RxJS์ ๋๋ค. Angular 2๋ ์์กดํ๋ ๊ฒ์๊ณ ์ฐ๋ฆฌ๋ ์ฌ์ฉํ๊ณ ์๋ค.
RxJS
๋ฐฐ์ด์ ๋ด๊ธด ๊ฒ๊ณผ ๋ชจ๋ ๊ฐ์ด ๊ด์ธก ๊ฐ๋ฅํ ๊ฒ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ ํ ์ ์๋ค : โข take (n)์ ์ฒ์ n ๊ฐ์ ์ด๋ฒคํธ (์๋ฅผ ๋ค์ด ์ฒ์ 5 ๊ฐ)์ ์ ํํ๋ค. โข map (fn)์ ๊ฐ ์ด๋ฒคํธ์ ์ ์ฉ๋์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. โข filter (์ ์ด) ์ ์ด๋ฅผ ์ถฉ์กฑ ์ด๋ฒคํธ ๋ง ํต๊ณผ ์ํจ๋ค. โข reduce (fn)์ ๋ชจ๋ ์ด๋ฒคํธ์ ์ ์ฉ๋๊ณ ์คํธ๋ฆผ์ ๋จ์ผ ๊ฐ์ผ๋ก ์ค์ธ๋ค. โข merge (s1, s2)๋ ์คํธ๋ฆผ์ ๋ณํฉํ๋ค. โข subscribe (fn)์ ์์ ํ ๊ฐ ์ด๋ฒคํธ์ ์ ์ฉ๋๋ค.
๋ฐ๋ผ์ ์ซ์์ ๋ฐฐ์ด์ ์ทจํ์ฌ ๊ฐ๊ฐ์ 2๋ฅผ ๊ณฑํ๊ณ 5๋ณด๋ค ์์ ๊ฐ์ ํํฐ๋งํ์ฌ ์ธ์ํ๋ฉด ํ ์ ์๋ค.
RxJS๋ ๋ฐฐ์ด์์ ๊ด์ธก ๊ฐ๋ฅ์ ๊ตฌ์ถํ๋ค. ๋ณด์๋ค์ํผ, ์ฐ๋ฆฌ๋ ๋๊ฐ์ ์ผ์ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ ๊ด์ธก ๋์์ ์ปฌ๋ ์ ์ด์์ด๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด๋ฒคํธ๊ฐ ๋์ฐฉํ๋ ๋น๋๊ธฐ ์ปฌ๋ ์ ์ด๋ค. ์ข์ ์๊ฐ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ์ด๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ผ์ด๋ ์ ์์ผ๋ฏ๋ก ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ ์ฌ์ฉํ ์์๋ ์ข์ ํ๋ณด๊ฐ ๋๋ค. ๋ค์์ jQuery๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ค.
๋ฌผ๋ก ํจ์์์ AJAX ์์ฒญ, ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ, ์น ์์ผ ์๋ต, ์ฝ์ ๋ฑ์ ํตํด ๊ด์ฐฐ ํ ์์๋ ๊ฒ์ ๋ง๋ค ์ ์๋ค.
Observable.creat๋ ๋งค๊ฐ ๋ณ์๋ก ์ฃผ์ด์ง ์ต์ ๋ฒ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด์. ์ฌ๊ธฐ์์๋ ๋จ์ํ ๋ฐ๋ชจ๋ฅผ ์ํ ํ๋์ ์ด๋ฒคํธ๋ง ๋ด๋ณด๋ธ๋ค.
๊ด์ฐฐ ๋ด์ฉ์ด ์๋ชป ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ ํ ์๋ ์๊ณ subscribe ๋ฉ์๋๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋ ๋ค๋ฅธ ์ฝ๋ฐฑ์ ์ฌ์ฉํ ์ ์๋ค.
์ฌ๊ธฐ์ map ๋ฉ์๋๋ ์์ธ๋ฅผ throwํ๋ฏ๋ก subscribe ๋ฉ์๋์ ๋ ๋ฒ์งธ ํธ๋ค๋ฌ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ค.
๊ด์ฐฐ ๊ฐ๋ฅ์ด ์๋ฃ๋๋ฉด ์ธ ๋ฒ์งธ ์ฒ๋ฆฌ๊ธฐ๋ก ์ก์ ์ ์๋ ์๋ฃ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ธ๋ค. ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฒ์ ๋ฉ์๋๋ 1์์ 5๊น์ง ๋ฐ๋ณต ํ ๋ค์ 'completed'์ ํธ๋ฅผ ๋ด๋ณด๋ธ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๊ด์ฐฐ ํ ์์๋ ๋ง์ ๊ฒ๋ค์ ํ ์ ์๋ค : โข transformation (delaying, debouncingโฆ) โข combination (merge, zip, combineLatestโฆ) โข filtering (distinct, filter, lastโฆ) โข maths (min, max, average, reduceโฆ) โข conditions (amb, includesโฆ)
๋น์ ์ด ๋ ๋ง์ ๊ฒ์ ์๊ณ ์ถ๋ค๋ฉด ์ฑ ์ด ํ์ํ ๊ฒ์ ๋๋ค! Rx Book์ ํ์ธํด ๋ณด์๋ผ. ์ด ์ฃผ์ ์๋ ๋ด๊ฐ ์ฐพ์ ์ต๊ณ ์ ์๊ฐ๊ฐ ํฌํจ๋์ด ์๋ค. ๊ฐ ๊ธฐ๋ฅ์ด ๋ฌด์์ ํ๋์ง ์๊ฐ์ ์ผ๋ก ์ ๋ํ๋ด๋ ค๋ฉด rxmarbles.com์ ๋ฐฉ๋ฌธ ํ์ฌ๋ผ.
Reactive programming in Angular 2
Angular 2๋ RxJS๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์๋ค. ํ๋ ์ ์ํฌ๋ Observable ๊ฐ์ฒด ์ฃผ์์ ์ด๋ํฐ๋ฅผ ์ ๊ณตํ๋ค. : EventEmitter. EventEmitter์๋ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ subscribe () ๋ฉ์๋๊ฐ ์์ผ๋ฉฐ ๋ฉ์๋๋ ์ธ ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์์ ํ ์ ์๋ค. โข ์ฌ๊ฑด์ ๋์ํ๋ ๋ฐฉ๋ฒ. โข ์ค๋ฅ์ ๋์ํ๋ ๋ฐฉ๋ฒ. โข ์๋ฃ์ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ. EventEmitter๋ emit () ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ์ ์๋ค.
subscribe ๋ฉ์๋๋ subscribe ๋๋ unsubscribe ๋ฉ์๋ ๋ฑ์ ์ฌ์ฉํ์ฌ subscription ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ด์ ๋ ๋ฐ์ ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ EventEmitter์ ๋ํด ์กฐ๊ธ ๋ ์์ ๋ณด์์ผ๋ฏ๋ก Angular 2์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด ๋ณด๋๋ก ํ์.
Reference URL
Last updated