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๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ธ์‡„ํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋‹ค.

[1, 2, 3, 4, 5]
  .map(x => x * 2)
  .filter(x => x > 5)
  .forEach(x => console.log(x)); // 6, 8, 10

RxJS๋Š” ๋ฐฐ์—ด์—์„œ ๊ด€์ธก ๊ฐ€๋Šฅ์„ ๊ตฌ์ถ•ํ•œ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ, ์šฐ๋ฆฌ๋Š” ๋˜‘๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Observable.from([1, 2, 3, 4, 5])
  .map(x => x * 2)
  .filter(x => x > 5)
  .subscribe(x => console.log(x)); // 6, 8, 10

๊ทธ๋Ÿฌ๋‚˜ ๊ด€์ธก ๋Œ€์ƒ์€ ์ปฌ๋ ‰์…˜ ์ด์ƒ์ด๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ๊ฐ€ ๋„์ฐฉํ•˜๋Š” ๋น„๋™๊ธฐ ์ปฌ๋ ‰์…˜์ด๋‹ค. ์ข‹์€ ์˜ˆ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ์ด๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ํ›„๋ณด๊ฐ€ ๋œ๋‹ค. ๋‹ค์Œ์€ jQuery๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ด๋‹ค.

const input = $('input');
Observable.fromEvent(input, 'keyup')
  .subscribe(() => console.log('keyup!'));
input.trigger('keyup'); // logs "keyup!"
input.trigger('keyup'); // logs "keyup!"

๋ฌผ๋ก  ํ•จ์ˆ˜์—์„œ AJAX ์š”์ฒญ, ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ, ์›น ์†Œ์ผ“ ์‘๋‹ต, ์•ฝ์† ๋“ฑ์„ ํ†ตํ•ด ๊ด€์ฐฐ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

const observable = Observable.create((observer) => observer.next('hello'));
observable.subscribe((value) => console.log(value));
// logs "hello"

Observable.creat๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง„ ์˜ต์ €๋ฒ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž. ์—ฌ๊ธฐ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ๋ฐ๋ชจ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ๋‚ด๋ณด๋‚ธ๋‹ค.

๊ด€์ฐฐ ๋‚ด์šฉ์ด ์ž˜๋ชป ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  subscribe ๋ฉ”์†Œ๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋‹ค๋ฅธ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ map ๋ฉ”์†Œ๋“œ๋Š” ์˜ˆ์™ธ๋ฅผ throwํ•˜๋ฏ€๋กœ subscribe ๋ฉ”์†Œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ํ•ธ๋“ค๋Ÿฌ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

Observable.range(1, 5)
  .map(x => {
   if (x % 2 === 1) {
   throw new Error('something went wrong');
   } else {
   return x;
   }
  })
  .filter(x => x > 5)
  .subscribe(x => console.log(x), error => console.log(error)); // something went wrong

๊ด€์ฐฐ ๊ฐ€๋Šฅ์ด ์™„๋ฃŒ๋˜๋ฉด ์„ธ ๋ฒˆ์งธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์™„๋ฃŒ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์œ„ ๋ฉ”์„œ๋“œ๋Š” 1์—์„œ 5๊นŒ์ง€ ๋ฐ˜๋ณต ํ•œ ๋‹ค์Œ 'completed'์‹ ํ˜ธ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค.

Observable.range(1, 5)
  .map(x => x * 2)
  .filter(x => x > 5)
  .subscribe(x => console.log(x), error => console.log(error), () => console.log('done'
));
// 6, 8, 10, done

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ด€์ฐฐ ํ•  ์ˆ˜์žˆ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค : โ€ข 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 () ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

const emitter = new EventEmitter();
emitter.subscribe(
  value => console.log(value),
  error => console.log(error),
  () => console.log('done')
);
emitter.emit('hello');
emitter.emit('there');
emitter.complete();
// logs "hello", then "there", then "done"

subscribe ๋ฉ”์†Œ๋“œ๋Š” subscribe ๋˜๋Š” unsubscribe ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ subscription ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const emitter = new EventEmitter();
const subscription = emitter.subscribe(
  value => console.log(value),
  error => console.log(error),
  () => console.log('done')
);
emitter.emit('hello');
subscription.unsubscribe(); // unsubscribe
emitter.emit('there');
// logs "hello" only

์ด์ œ๋Š” ๋ฐ˜์‘ ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ EventEmitter์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ์•„ ๋ณด์•˜์œผ๋ฏ€๋กœ Angular 2์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด ๋ณด๋„๋ก ํ•˜์ž.

Reference URL

Last updated