์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. Sergey Omelnitsky๋์ด ์ฐ๋ฝํ์ จ์ต๋๋ค. ์ผ๋ง ์ ์ ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ดํ ์คํธ๋ฆผ์ ์ฃผ์ตํ์ฌ JavaScript์ ๋น๋๊ธฐ์ฑ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ์ค๋ ์ ๋ ์ด ์๋ฃ์ ๋ํด ๋ฉ๋ชจ๋ฅผ ํ๊ณ ์ถ์ต๋๋ค.
ํ์ง๋ง ์ฃผ์ ๋ด์ฉ์ ์์ํ๊ธฐ ์ ์ ์๊ฐ ๊ธ์ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ผ ์ ์๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ์คํ๊ณผ ํ๊ฐ ๋ฌด์์ธ๊ฐ์?
์คํ ํ์ ์ ์ถ LIFO ๋ฐฉ์์ผ๋ก ์์๋ฅผ ์ป๋ ์ปฌ๋ ์ ์ ๋๋ค.
์ด ์ ์ ์ ์ถ FIFO ๋ฐฉ์์ผ๋ก ์์๋ฅผ ์ป๋ ์ปฌ๋ ์ ์ ๋๋ค.
์ข์, ๊ณ์ํ์.
JavaScript๋ ๋จ์ผ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ์ด๋ ์คํ ์ค๋ ๋๊ฐ ํ๋๋ง ์๊ณ ํจ์๊ฐ ์คํ์ ์ํด ๋๊ธฐํ๋ ์คํ์ด ํ๋๋ฟ์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ JavaScript๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์๋ ๋ฐ๋ฉด ๋ค๋ฅธ ์์ ์ ํธ์ถ๋ ๋๊น์ง ์คํ์์ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
ํธ์ถ ์คํ ๊ฐ๋จํ ๋งํด์ ํ๋ก๊ทธ๋จ์์ ์ฐ๋ฆฌ๊ฐ ์๋ ์์น์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ํจ์์ ์ ๋ฌํ๋ฉด ํด๋น ํญ๋ชฉ์ ์คํ ๋งจ ์๋ก ํธ์ํฉ๋๋ค. ํจ์์์ ๋์์ฌ ๋ ์คํ์ ์ต์์ ์์๋ฅผ ํํ๊ณ ํจ์๋ฅผ ํธ์ถํ ์์น๋ก ๋์๊ฐ๋๋ค. ์ด๊ฒ์ด ์คํ์ด ํ ์ ์๋ ์ ๋ถ์ ๋๋ค. ์ด์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด JavaScript์์ ๋น๋๊ธฐ์ฑ์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์๋ ์คํ ์ธ์๋ ์์ WebAPI ์์ ์ ์ํ ํน์ ๋๊ธฐ์ด์ด ์์ต๋๋ค. ์ด ํ์ ํจ์๋ ์คํ์ด ์์ ํ ์ง์์ง ํ์๋ง ์์๋๋ก ์คํ๋ฉ๋๋ค. ๊ทธ ํ์์ผ ์คํ์ ์ํด ํ์์ ์คํ์ผ๋ก ํธ์๋ฉ๋๋ค. ํ์ฌ ์คํ์ ์์๊ฐ ํ๋ ์ด์ ์์ผ๋ฉด ์คํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ํจ์๊ฐ ๊ฐ๋ ์ฐจ ์๋ ๋์์๋ ๋๊ธฐ์ด์์ ์คํ์ผ๋ก ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๊ฐ์ ์ ํํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ณ ๋จ๊ณ๋ณ ๊ตฌํ์ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ํ ์์คํ ์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
console.log('Hi');
setTimeout(function cb1() {
console.log('cb1');
}, 5000);
console.log('Bye');
1) ์์ง ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ฝ์์ ๊นจ๋ํ๊ณ ํธ์ถ ์คํ์ ๋น์ด ์์ต๋๋ค.
2) ๊ทธ๋ฐ ๋ค์ console.log('Hi') ๋ช ๋ น์ด ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
3) ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฑ์ทจ๋์์ต๋๋ค
4) ๊ทธ๋ฐ ๋ค์ console.log('Hi')๊ฐ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
5) ์ด์ setTimeout(function cb1() {โฆ }) ๋ช ๋ น์ผ๋ก ์ด๋ํฉ๋๋ค. ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
6) setTimeout(function cb1() {โฆ }) ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ Web API์ ์ผ๋ถ์ธ ํ์ด๋จธ๋ฅผ ์์ฑํฉ๋๋ค. ์นด์ดํธ๋ค์ด์ด ์ํ๋ฉ๋๋ค.
7) setTimeout(function cb1() {... }) ๋ช ๋ น์ด ์์ ์ ์๋ฃํ๊ณ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋์์ต๋๋ค.
8) console.log('Bye') ๋ช ๋ น์ด ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
9) console.log('Bye') ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค.
10) console.log('Bye') ๋ช ๋ น์ด ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
11) ์ต์ 5000ms๊ฐ ์ง๋๋ฉด ํ์ด๋จธ๊ฐ ์ข ๋ฃ๋๊ณ ์ฝ๋ฐฑ cb1์ด ์ฝ๋ฐฑ ๋๊ธฐ์ด์ ๋ฐฐ์น๋ฉ๋๋ค.
12) ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ๋ฐฑ ํ์์ ํจ์ cb1์ ๊ฐ์ ธ์ ํธ์ถ ์คํ์ ๋ฐฐ์นํฉ๋๋ค.
13) cb1 ํจ์๊ฐ ์คํ๋๊ณ ํธ์ถ ์คํ์ console.log('cb1')๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
14) console.log('cb1') ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค.
15) console.log('cb1') ๋ช ๋ น์ด ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
16) ํจ์ cb1์ด ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
์ญํ์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์, ์ฐ๋ฆฌ๋ JavaScript์์ ๋น๋๊ธฐ์ฑ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์ดํด๋ณด์์ต๋๋ค. ์ด์ ๋น๋๊ธฐ ์ฝ๋์ ๋ฐ์ ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋น๋๊ธฐ ์ฝ๋์ ์งํ.
a(function (resultsFromA) {
b(resultsFromA, function (resultsFromB) {
c(resultsFromB, function (resultsFromC) {
d(resultsFromC, function (resultsFromD) {
e(resultsFromD, function (resultsFromE) {
f(resultsFromE, function (resultsFromF) {
console.log(resultsFromF);
})
})
})
})
})
});
์ฐ๋ฆฌ๊ฐ JavaScript๋ก ์๊ณ ์๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํจ์์ ์ํด์๋ง ๊ตฌํ๋ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ณ์์ฒ๋ผ ๋ค๋ฅธ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ฝ๋ฐฑ์ ์ด๋ ๊ฒ ํ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌํ, ์ฐ์ธ, ์ฌํ์ผ๋ก ๋ณํ ๋๊น์ง ๋ฉ์ง๊ณ , ์ฌ๋ฏธ์๊ณ , ์ ์พํฉ๋๋ค. ์? ๊ฐ๋จ ํด:
- ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํ๋ก์ ํธ๋ ๋น ๋ฅด๊ฒ ๋ชจํธํ๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์ค์ฒฉ๋ ๋ธ๋ก, ์ฆ "์ฝ๋ฐฑ ์ง์ฅ"์ผ๋ก ๋ณํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋์น๊ธฐ ์ฝ์ต๋๋ค.
- return์ ์ฌ์ฉํ์ฌ ํํ์์ ๋ฐํํ ์ ์์ต๋๋ค.
Promise์ ์ถํ์ผ๋ก ์ํฉ์ ์กฐ๊ธ ๋์์ก์ต๋๋ค.
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 2000);
}).then((result) => {
alert(result);
return result + 2;
}).then((result) => {
throw new Error('FAILED HERE');
alert(result);
return result + 2;
}).then((result) => {
alert(result);
return result + 2;
}).catch((e) => {
console.log('error: ', e);
});
- ์ฝ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๋ Promise ์ฒด์ธ์ด ๋ํ๋ฌ์ต๋๋ค.
- ์ค๋ฅ๋ฅผ ์ก๋ ๋ณ๋์ ๋ฐฉ๋ฒ์ด ๋ฑ์ฅํ์ต๋๋ค.
- Promise.all์ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ ์คํ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํ์ต๋๋ค.
- async/await๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฒฉ๋ ๋น๋๊ธฐ์ฑ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฝ์์๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝ์์ ํฌ๋ฒ๋ฆฐ๊ณผ ํจ๊ป ์ถค์ ์ถ์ง ์๊ณ ๋ ์ทจ์๋ ์ ์์ผ๋ฉฐ, ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ทธ๊ฒ์ด ํ๋์ ๊ฐ์น๋ก ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ธ์์, ์ฐ๋ฆฌ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์กฐ๋กญ๊ฒ ์ ๊ทผํ์ต๋๋ค. ํผ๊ณคํ? ๋คํํ๋ ์ฐจ๋ฅผ ๋์ฌ์ ์๊ฐํด๋ณด๊ณ ๋ค์ ์์ ๋ ๋ง์ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์ํ๊ฒ ์ต๋๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐโ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๋ณ๊ฒฝ ์ ํ์ ์ด์ ์ ๋ง์ถ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋๋ค. ๋ฐ์ดํฐ ์คํธ๋ฆผ์ด ๋ฌด์์ธ์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// ะะพะปััะฐะตะผ ัััะปะบั ะฝะฐ ัะปะตะผะตะฝั
const input = ducument.querySelector('input');
const eventsArray = [];
// ะััะธะผ ะบะฐะถะดะพะต ัะพะฑััะธะต ะฒ ะผะฐััะธะฒ eventsArray
input.addEventListener('keyup',
event => eventsArray.push(event)
);
์ ๋ ฅ ํ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ์์ฑํ๊ณ ์์ผ๋ฉฐ ์ ๋ ฅ ์ด๋ฒคํธ์ ๋ชจ๋ ํค์ ์ ๋ํด ์ด๋ฒคํธ๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค. ๋์์ ์ฐ๋ฆฌ ๋ฐฐ์ด์ด ์๊ฐ๋ณ๋ก ์ ๋ ฌ๋์ด ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ๊ณ ์ถ์ต๋๋ค. ์ดํ ์ฌ๊ฑด์ ์ง์๋ ์ด์ ์ฌ๊ฑด์ ์ง์๋ณด๋ค ํฝ๋๋ค. ์ด๋ฌํ ๋ฐฐ์ด์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋จ์ํ๋ ๋ชจ๋ธ์ด์ง๋ง ์์ง ํ๋ฆ์ ์๋๋๋ค. ์ด ๋ฐฐ์ด์ ์์ ํ๊ฒ ์คํธ๋ฆผ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ค๋ฉด ๊ตฌ๋ ์์๊ฒ ์ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ์์ ์ด๋ป๊ฒ๋ ์๋ฆด ์ ์์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ๋ฆ์ ์ ์์ ๋๋ฌํ์ต๋๋ค.
๋ฐ์ดํฐ ์คํธ๋ฆผ
const { interval } = Rx;
const { take } = RxOperators;
interval(1000).pipe(
take(4)
)
ํ๋ฆโ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ๋ํ๋ผ ์ ์๋ ์๊ฐ๋ณ๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋๋ค. ์ด์ ํ๋์ ์์ ์ด ์ฝ๋์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ํธ์ถํด์ผ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ผ๋ง๋ ํธ๋ฆฌํด์ง๋์ง ์์ํด ๋ณด์ญ์์ค. ์คํธ๋ฆผ์ ๊ตฌ๋ ํ๊ธฐ๋ง ํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ์๋ฆผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ RxJs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๊ฒ์ ํ ์ ์์ต๋๋ค.
RxJS ๊ด์ฐฐ ๊ฐ๋ฅํ ์ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ณธ ์ ํ์ ์ ๊ณตํฉ๋๋ค. ์ฃผ๋ชฉํ ๋งํ, ์ฌ๋ฌ ๋ณด์กฐ ์ ํ(๊ด์ฐฐ์, ์ค์ผ์ค๋ฌ, ์ฃผ์ ) ๋ฐ ์ปฌ๋ ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฒคํธ ์์ ์ ์ํ ์ฐ์ฐ์(๋งคํ, ํํฐ, ์ถ์, ๋ชจ๋ JavaScript Array์ ์ ์ฌํ ๊ฒ).
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํด ๋ด ์๋ค.
๊ด์ฐฐ ๊ฐ๋ฅ, ๊ด์ฐฐ์, ์์ฐ์
Observable์ ์ฐ๋ฆฌ๊ฐ ์ดํด๋ณผ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ณธ ์ ํ์ ๋๋ค. ์ด ํด๋์ค์๋ RxJ ๊ตฌํ์ ์ฃผ์ ๋ถ๋ถ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ ๊ตฌ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ ํ ์ ์๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค.
Observable์ ์์ ์ ๋ฐ์ดํธ ์์ฑ์ ์ํ ๋์ฐ๋ฏธ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค. ๊ด์ฐฐ์. Observer์ ๊ฐ ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์์ฐ์. ์ด๋ ๋ฐฐ์ด, ๋ฐ๋ณต์, ์น ์์ผ, ์ผ์ข ์ ์ด๋ฒคํธ ๋ฑ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ Observable์ Producer์ Observer ์ฌ์ด์ ์งํ์๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
Observable์ ์ธ ๊ฐ์ง ์ ํ์ Observer ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ค์ โ ์๋ก์ด ๋ฐ์ดํฐ
- error โ ์์ธ๋ก ์ธํด ์ํ์ค๊ฐ โโ์ข ๋ฃ๋ ๊ฒฝ์ฐ ์ค๋ฅ์ ๋๋ค. ์ด ์ด๋ฒคํธ๋ ๋ํ ์ํ์ค์ ์๋ฃ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ฃ โ ์ํ์ค ์๋ฃ์ ๋ํ ์ ํธ์ ๋๋ค. ์ด๋ ๋ ์ด์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ชจ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์ฒ์์๋ 1, 2, 3, 1์ด ์ดํ์ ๊ฐ์ ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค. 4๊ฐ๋ฅผ ์ป๊ณ ์คํธ๋ฆผ์ ์ข ๋ฃํ๊ฒ ์ต๋๋ค.
ํฐ ์๋ฆฌ๋ก ์๊ฐํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ๋์ ๋๋ ๊ทธ๊ฒ์ ๋ํด ์ฐ๋ ๊ฒ๋ณด๋ค ๊ทธ๊ฒ์ ๋งํ๋ ๊ฒ์ด ๋ ํฅ๋ฏธ๋กญ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๐
๊ตฌ๋
์คํธ๋ฆผ์ ๊ตฌ๋ ํ๋ฉด ์ ํด๋์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ์ ์ฒญ์ด๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ ์ ์ทจ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ ๊ฑฐ๋ถ. ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ ์ ๊ทธ๋ฃนํํ ์๋ ์์ต๋๋ค. ๋ํ๋ค. ์, ๋ค์์ ์ฌ์ฉํ์ฌ ์ค๋ ๋๋ฅผ ๊ทธ๋ฃน ํด์ ํ ์ ์๋ค๋ ๊ฒ์ด ๋ ผ๋ฆฌ์ ์ ๋๋ค. ์ ๊ฑฐ. ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ ๋ฉ์๋๋ ๋ค๋ฅธ ๊ตฌ๋ ์ ์ ๋ ฅ์ผ๋ก ํ์ฉํฉ๋๋ค. ๊ตฌ๋ ์ ์ทจ์ํ ๋ ๋ง์น unsubscribe ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ฒ๋ผ ๋ชจ๋ ํ์ ๊ตฌ๋ ์ ๊ตฌ๋ ์ด ์ทจ์๋๋ค๋ ์ ์ ์ฐธ๊ณ ํ๊ณ ์ถ์ต๋๋ค. ๊ณ์ํ์ธ์.
์คํธ๋ฆผ ์ ํ
๋จ๊ฑฐ์ด
๊ฐ๊ธฐ
์์ฐ์๋ ๊ด์ฐฐ ๊ฐ๋ฅ ์ธ๋ถ์์ ์์ฑ๋ฉ๋๋ค.
์์ฐ์๋ Observable ๋ด๋ถ์ ์์ฑ๋ฉ๋๋ค.
Observable์ด ์์ฑ๋ ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ ๊ตฌ๋
์ ์ ๊ณต๋ฉ๋๋ค.
๊ตฌ๋
์ทจ์๋ฅผ ์ํ ์ถ๊ฐ ๋
ผ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์ค๋ ๋๊ฐ ์์ฒด์ ์ผ๋ก ์ข
๋ฃ๋ฉ๋๋ค.
์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ผ๋์ผ ๊ด๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋ ๊ตฌ๋
์ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
๊ตฌ๋
์ ๋
๋ฆฝ์ ์
๋๋ค.
๊ตฌ๋
ํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
์ ๊ตฌ๋
์ ๋ํ ๋ชจ๋ ์คํธ๋ฆผ ๊ฐ์ ์ฌ๋ฐํํฉ๋๋ค.
๋น์ ํ์๋ฉด ํซ์คํธ๋ฆผ์ ๊ทน์ฅ์์ ์์๋๋ ์ํ๋ผ๊ณ ์๊ฐํ๊ฒ ์ต๋๋ค. ์ด๋ ์์ ์ ๋์ฐฉํ๋์ง, ๊ทธ ์๊ฐ๋ถํฐ ์์ฒญ์ ์์ํ์ต๋๋ค. ์ ๋ ์ฝ๋ ํ๋ก์ฐ๋ฅผ ๊ธฐ์ ๋ถ์ผ์ ํตํ์ ๋น๊ตํ๊ฒ ์ต๋๋ค. ์ง์ํ๋ค. ๋ชจ๋ ๋ฐ์ ์๋ ์์ฑ ๋ฉ์ผ ๋ น์์ ์ฒ์๋ถํฐ ๋๊น์ง ๋ฃ์ง๋ง ์์ ๊ฑฐ๋ถ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฅผ ๋์ ์ ์์ต๋๋ค.
์์ ๋ฐ๋ปํ ํ๋ฆ๋ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ๊ณ ์ถ์ต๋๋ค. (์ด ์ ์๋ ๊ทนํ ๋๋ฌผ๊ฒ ์ธ๊ตญ ์ปค๋ฎค๋ํฐ์์๋ง ์ ํ์ต๋๋ค.) ์ด๊ฒ์ ์ฐจ๊ฐ์ด ํ๋ฆ์์ ๋จ๊ฑฐ์ด ํ๋ฆ์ผ๋ก ์ ํ๋๋ ํ๋ฆ์ ๋๋ค. ์ง๋ฌธ์ด ๋ฐ์ํฉ๋๋ค-์ด๋์์ ์ฌ์ฉํฉ๋๊น?) ์ฐ์ต์์ ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ Angular์ ํจ๊ป ์ผํ๊ณ ์์ต๋๋ค. ๊ทธ๋ rxjs๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ค๋ฉด ์ฝ๋ ์ค๋ ๋๋ฅผ ์์ํ๊ณ asyncPipe๋ฅผ ์ฌ์ฉํ์ฌ ํ ํ๋ฆฟ์์ ์ด ์ค๋ ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ํ์ดํ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๊ณ ์ฝ๋ ์คํธ๋ฆผ์ ์ ์๋ก ๋์๊ฐ๋ฉด ๊ฐ ํ์ดํ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ฒ ๋๋๋ฐ, ์ด๋ ์๋ฌด๋ฆฌ ๋งํด๋ ์ด์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์คํธ๋ฆผ์ ๋ฐ๋ปํ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ฉด ์์ฒญ์ด ํ ๋ฒ ๋ฐ์ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ๋ฆ ์ ํ์ ์ดํดํ๋ ๊ฒ์ ์ด๋ณด์์๊ฒ๋ ์๋นํ ์ด๋ ต์ง๋ง ์ค์ํฉ๋๋ค.
์ฐ์ฐ์
return this.http.get(`${environment.apiUrl}/${this.apiUrl}/trade_companies`)
.pipe(
tap(({ data }: TradeCompanyList) => this.companies$$.next(cloneDeep(data))),
map(({ data }: TradeCompanyList) => data)
);
์ด์์๋ ์คํธ๋ฆผ ์์ ๋ฅ๋ ฅ์ ํ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Observable์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ดํ๋ โโ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ณด๊ณ , ์ด์์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ์ฉํ ์ ๋ณด์ ์๋ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐพ์ ์ ์์ต๋๋ค.
์ฐ์ฐ์ - ์ค
๋ณด์กฐ ์ฐ์ฐ์๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋จํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก Observable์ ์์ฑํฉ๋๋ค.
์ฐ์ฐ์ - ํํฐ
ํํฐ ์ฐ์ฐ์๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์คํธ๋ฆผ ์ ํธ๋ฅผ ํํฐ๋งํฉ๋๋ค. ์ฐ์ฐ์๊ฐ true๋ฅผ ๋ฐํํ๋ฉด ๋ ์ด์ ๊ฑด๋๋๋๋ค.
์ด์์ - ๋ฐ์
take โ ์ด๋ฏธํฐ ์์ ๊ฐ์ ์ทจํ ํ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
์ฐ์ฐ์ - debounceTime
debounceTime - ์ถ๋ ฅ ์ฌ์ด์ ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ ๋ด์ ์ํ๋ ๋ฐฉ์ถ๋ ๊ฐ์ ์ญ์ ํฉ๋๋ค. ์๊ฐ ๊ฐ๊ฒฉ์ด ๊ฒฝ๊ณผํ ํ ๋ง์ง๋ง ๊ฐ์ ๋ฐฉ์ถํฉ๋๋ค.
const { Observable } = Rx;
const { debounceTime, take } = RxOperators;
Observable.create((observer) => {
let i = 1;
observer.next(i++);
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next(i++)
}, 1000);
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1500ะผั
setInterval(() => {
observer.next(i++)
}, 1500);
}).pipe(
debounceTime(700), // ะะถะธะดะฐะตะผ 700ะผั ะทะฝะฐัะตะฝะธั ะฟัะตะถะดะต ัะตะผ ะพะฑัะฐะฑะพัะฐัั
take(3)
);
์ฐ์ฐ์ - takeWhile
takeWhile์ด false๋ฅผ ๋ฐํํ ๋๊น์ง ๊ฐ์ ๋ด๋ณด๋ธ ํ ์ค๋ ๋์์ ๊ตฌ๋ ์ ์ทจ์ํฉ๋๋ค.
const { Observable } = Rx;
const { debounceTime, takeWhile } = RxOperators;
Observable.create((observer) => {
let i = 1;
observer.next(i++);
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next(i++)
}, 1000);
}).pipe(
takeWhile( producer => producer < 5 )
);
์ฐ์ฐ์ - ๊ฒฐํฉ์ต์
CombineLatest ์ฐ์ฐ์๋ promise.all๊ณผ ๋ค์ ์ ์ฌํฉ๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ํ๋๋ก ๊ฒฐํฉํฉ๋๋ค. ๊ฐ ์ค๋ ๋๊ฐ ์ต์ํ ํ๋์ ๋ฐฉ์ถ์ ์ํํ ํ ๋ฐฐ์ด ํํ๋ก ๊ฐ ์ค๋ ๋์์ ์ต์ ๊ฐ์ ์ป์ต๋๋ค. ๋ํ ๋ณํฉ๋ ์คํธ๋ฆผ์์ ๋ฐฉ์ถ๋ ํ์๋ ์๋ก์ด ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
const { combineLatest, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
});
const observer_2 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 750ะผั
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
});
combineLatest(observer_1, observer_2).pipe(take(5));
์ฐ์ฐ์ - zip
Zip - ๊ฐ ์ค๋ ๋์ ๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ด๋ฌํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ด ์ด๋ค ์ค๋ ๋์์๋ ๋์ค์ง ์์ผ๋ฉด ๊ทธ๋ฃน์ด ํ์ฑ๋์ง ์์ต๋๋ค.
const { zip, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
});
const observer_2 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 750
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
});
const observer_3 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 500
setInterval(() => {
observer.next('c: ' + i++);
}, 500);
});
zip(observer_1, observer_2, observer_3).pipe(take(5));
์ฐ์ฐ์ - forkJoin
forkJoin๋ ์ค๋ ๋๋ฅผ ์กฐ์ธํ์ง๋ง ๋ชจ๋ ์ค๋ ๋๊ฐ ์๋ฃ๋ ๋๋ง ๊ฐ์ ๋ด๋ณด๋ ๋๋ค.
const { forkJoin, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
}).pipe(take(3));
const observer_2 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 750
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
}).pipe(take(5));
const observer_3 = Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 500
setInterval(() => {
observer.next('c: ' + i++);
}, 500);
}).pipe(take(4));
forkJoin(observer_1, observer_2, observer_3);
์ฐ์ฐ์ - ์ง๋
๋งต ๋ณํ ์ฐ์ฐ์๋ ์ด๋ฏธํฐ ๊ฐ์ ์๋ก์ด ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค.
const { Observable } = Rx;
const { take, map } = RxOperators;
Observable.create((observer) => {
let i = 1;
// ะัะฟััะบะฐะตะผ ะทะฝะฐัะตะฝะธะต ัะฐะท ะฒ 1000ะผั
setInterval(() => {
observer.next(i++);
}, 1000);
}).pipe(
map(x => x * 10),
take(3)
);
์ด์์ - ๊ณต์ , ํญ
ํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ์์ฉ, ์ฆ ์ํ์ค์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ชจ๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๊ณต์ ์ ํธ๋ฆฌํฐ ์ด์์๋ ์ฝ๋ ์คํธ๋ฆผ์ ํซ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ด์์์์ ์์ ์ ๋๋ฌ์ต๋๋ค. ์ฃผ์ ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
ํฐ ์๋ฆฌ๋ก ์๊ฐํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ์ฐจ๋ฅผ ๋ง์๋ฌ ๊ฐ์ต๋๋ค. ๋๋ ์ด๋ฌํ ์์ ์ง์ณค์ต๋๋ค ๐
๋์๊ฐ์กฑ
์ฃผ์ ๊ตฐ์ ๋จ๊ฑฐ์ด ํ๋ฆ์ ๋ํ์ ์ธ ์์ ๋๋ค. ์ด๋ฌํ ํด๋์ค๋ ๊ด์ฐฐ ๊ฐ๋ฅ ๋ฐ ๊ด์ฐฐ์ ์ญํ ์ ๋์์ ์ํํ๋ ์ผ์ข ์ ํ์ด๋ธ๋ฆฌ๋์ ๋๋ค. ์ฃผ์ ๊ฐ ํซ์ค๋ ๋์ด๋ฏ๋ก ๊ตฌ๋ ์ ์ทจ์ํด์ผ ํฉ๋๋ค. ์ฃผ์ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ค์ โ ์ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ์ ์ก
- error - ์ค๋ฅ ๋ฐ ์ค๋ ๋ ์ข ๋ฃ
- ์๋ฃ โ ์ค๋ ๋ ์๋ฃ
- ๊ตฌ๋ โ ์คํธ๋ฆผ ๊ตฌ๋
- unsubscribe โ ์คํธ๋ฆผ ๊ตฌ๋ ์ ์ทจ์ํฉ๋๋ค.
- asObservable โ ๊ด์ฐฐ์๋ก ๋ณํ
- toPromise โ ์ฝ์์ผ๋ก ๋ณํ๋ฉ๋๋ค.
๊ณผ๋ชฉ์ 4 5๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํฐ ์๋ฆฌ๋ก ์๊ฐํ๊ธฐ
์คํธ๋ฆผ์์ 4๋ช ์ด ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์์๋๋ฐ ์๊ณ ๋ณด๋ ํ ๋ช ์ด ๋ ์ถ๊ฐ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ค์ด ๋งํ๋ฏ์ด ์ด๊ณ ๋ฐฐ์ฐ์ญ์์ค.
๊ฐ๋จํ ์ฃผ์ new Subject()
โ ๊ฐ์ฅ ๊ฐ๋จํ ์ ํ์ ์ฃผ์ ์
๋๋ค. ๋งค๊ฐ๋ณ์ ์์ด ์์ฑ๋์์ต๋๋ค. ๊ตฌ๋
ํ ๋ฐ์ ๊ฐ๋ง ์ ์กํฉ๋๋ค.
ํ๋ ์ฃผ์ new BehaviorSubject( defaultData<T> )
โ ์ ์๊ฐ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ํ์ ์ฃผ์ ์
๋๋ค. ์
๋ ฅ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ๊ตฌ๋
์ ์ ์ก๋๋ ์ต์ ํธ์ ๋ฐ์ดํฐ๋ฅผ ํญ์ ์ ์ฅํฉ๋๋ค. ์ด ํด๋์ค์๋ ์คํธ๋ฆผ์ ํ์ฌ ๊ฐ์ ๋ฐํํ๋ ์ ์ฉํ ๊ฐ ๋ฉ์๋๋ ์์ต๋๋ค.
์ฌ์์ฃผ์ new ReplaySubject(bufferSize?: number, windowTime?: number)
โ ์
๋ ฅ์ ์ ํ์ ์ผ๋ก ์์ฒด์ ์ผ๋ก ์ ์ฅํ ๊ฐ์ ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ทจํ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ๊ฒฝ์ด ํ์ํ ์๊ฐ์ ์ทจํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ์ฃผ์ new AsyncSubject()
โ ๊ตฌ๋
์ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ผ๋ฉฐ ์๋ฃ๋ ๋๋ง ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ์คํธ๋ฆผ์ ๋ง์ง๋ง ๊ฐ๋ง ๋ฐํ๋ฉ๋๋ค.
์น์์ผ์ฃผ์ new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>)
โ ๋ฌธ์์๋ ๊ทธ์ ๋ํ ๋ด์ฉ์ด ์์ผ๋ฉฐ ์ ๋ ์ฒ์์ผ๋ก ๊ทธ๋ฅผ ๋ต์ต๋๋ค. ๊ทธ๊ฐ ๋ฌด์์ ํ๋์ง ์๋ ์ฌ๋์ด ์๋ค๋ฉด ์ ์ด์ฃผ์๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
ํด. ์, ์ค๋ ๋ง์๋๋ฆฌ๊ณ ์ถ์ ๋ด์ฉ์ ๋ชจ๋ ๋ค ๋ค๋ฃจ์์ต๋๋ค. ์ด ์ ๋ณด๊ฐ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ ์ฉํ ์ ๋ณด ํญ์์ ์ฐธ๊ณ ๋ฌธํ ๋ชฉ๋ก์ ์ง์ ์ฝ์ด๋ณด์ค ์ ์์ต๋๋ค.
์ ์ฉํ ์ ๋ณด
์คํธ๋ฆผ ๋งํฌ JS ์๋ ๋ฐฉ์: ์์ง ๊ฐ์, ๋ฐํ์ ๋ฉ์ปค๋์ฆ, ํธ์ถ ์คํ JS ์๋ ๋ฐฉ์: ์ด๋ฒคํธ ๋ฃจํ, ๋น๋๊ธฐ ๋ฐ async/await๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ XNUMX๊ฐ์ง ๋ฐฉ๋ฒ JavaSript์์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์๋ํ๋ ๋ฐฉ์ ๋น๋๊ธฐ JavaScript์ ์งํ RxJS๋ ๋ฌด์์ด๋ฉฐ, RxJS๋ฅผ ์๋ ๊ฒ์ด ์ ์ ์ฉํ๊ฐ์?
RxJS์ ์ค์ ์ ์ฉ RxJS Observable ํํ ๋ฆฌ์ผ โ Observable ์์ฑ ๋ฐ ๊ตฌ๋ RXJS: ํซ ๋ฐ ์ฝ๋ Observable Observable์ ์์ฑํ๊ธฐ ์ํ ํด๋์ค, ํจ์. ์ด์์. ์์ ๋ฅผ ํตํ RxJS ์ฐ์ฐ์ API ๋ชฉ๋ก RxJS์ ๋ค์ํ ์ฃผ์ ์ ์ผ์
์ถ์ฒ : habr.com