1. ์๋ฐ์คํฌ๋ฆฝํธ ์ ์ด ํ๋ฆ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ ๋์์ ์ฒ๋ฆฌํ๋ค.
- ํน์ ์ฝ๋์ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ์ฝ๋์ ์คํ์ ๋ฉ์ถ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํ
-
console.log('1'); setTimeout(() => {console.log('2');}, 1000); console.log('3');
- ๋ค๋ฅธ ๋ฉํฐ์ค๋ ๋ ์ธ์ด์์์ ๊ฒฐ๊ณผ: '1'์ถ๋ ฅ → 1์ด ํ '2' ์ถ๋ ฅ → '3'์ถ๋ ฅ
- ์๋ฐ์คํฌ๋ฆฝํธ์์์ ๊ฒฐ๊ณผ: '1'์ถ๋ ฅ → '3'์ถ๋ ฅ → 1์ด ํ '2' ์ถ๋ ฅ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง
- ํ๋์ ๋ฉ์ธ ์ค๋ ๋๋ก ๊ตฌ์ฑ (์ฆ, ๋จ ํ๋์ Call stack์ ์ฌ์ฉ)
- ๋ฉ์ธ ์ค๋ ๋๋ ์ฝ๋๋ฅผ ์ฝ์ด ํ ์ค์ฉ ์คํ
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค
1-1. ๋๊ธฐ์ ์ ์ด ํ๋ฆ
- ํ์ฌ ์คํ ์ค์ธ ์ฝ๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์คํํ์ง ์๋ ๊ฒ
- ๋ถ๊ธฐ๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํจ์ ํธ์ถ ๋ฑ
- ์ฝ๋์ ํ๋ฆ๊ณผ ์ค์ ์ ์ด ํ๋ฆ์ด ๋์ผ
- ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๊ธด ์๊ฐ ์ ์ ํ๋ฉด, ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๊ฒ ํ๋ค.
1-2. ๋น๋๊ธฐ์ ์ ์ด ํ๋ฆ
- ํ์ฌ ์คํ ์ค์ธ ์ฝ๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ๋ค์ ๋ผ์ธ์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ
- ํ๋ก๋ฏธ์ค, ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ ํจ์ ๋ฑ
- ์ฝ๋ ํ๋ฆ๊ณผ ์ค์ ์ ์ด ํ๋ฆ์ด ๋ค๋ฅด๋ค
- ๋น๋๊ธฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ๋ค.
2. ์ด๋ฒคํธ ๋ฃจํ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
- ๋์ , ๋น๋๊ธฐ ์ฝ๋๋ ์ ํด์ง ํจ์๋ฅผ ์ ๊ณตํ์ฌ ํ์ฉํ ์ ์๋ค. ์ด ๋, ์ด ํจ์๋ค์ API๋ผ ํ๋ค.
- setTimeout, XMLHttpRequest, fetch ๋ฑ์ Web API๊ฐ ์๋ค.
- node.js์ ๊ฒฝ์ฐ ํ์ผ ์ฒ๋ฆฌ API, ์ํธํ API ๋ฑ์ ์ ๊ณตํ๋ค.
2-1. ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ชจ๋ธ
- ๋ฉ์ธ ์ค๋ ๋: Call stack์ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์คํ
- ๋น๋๊ธฐ ํ๊ฒฝ: Task queue, Job queue
- ์ด๋ฒคํธ ๋ฃจํ: ๋น๋๊ธฐ ์ฝ๋ ํธ์ถ, ๋น๋๊ธฐ ์ฝ๋ ์ฒ๋ฆฌ, ๊ฒฐ๊ณผ ํจ์ ๋ฐํ
- ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์ธ๋ถ์ ์กด์ฌ
- API ๋ชจ๋์ ๋น๋๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌ ํ Task queue์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ Call stack์ด ๋น์์ง๋ฉด, Task queue์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ค.
2-2. ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์
- Web API: ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณต๋๋ API์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ ์๋์ง ์์๋ setTimeout์ด๋ HTTP ์์ฒญ(ajax) ๋ฉ์๋, DOM ์ด๋ฒคํธ ๋ฑ์ ๋ฉ์๋๋ฅผ ์ง์ํ๋ค.
- Task Queue: ์ด๋ฒคํธ ๋ฐ์ ํ ํธ์ถ๋์ด์ผ ํ ์ฝ๋ฐฑ ํจ์๋ค์ด ๊ธฐ๋ค๋ฆฌ๋ ๊ณต๊ฐ. ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ ํ ์์๋๋ก ์ค์ ์ ์์ผ๋ฏ๋ก ์ฝ๋ฐฑ ํ(Callback Queue)๋ผ๊ณ ๋ ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ๋ก ํธ์ถ๋๋ ํจ์๋ค์ ํธ์ถ ์คํ(Call Stack)์ ์์ด์ง ์๊ณ ํ์คํฌ ํ(Task Queue)๋ก ๋ณด๋ด์ง๋ค.
- Event Loop: ์ด๋ฒคํธ ๋ฐ์ ์ ํธ์ถํ ์ฝ๋ฐฑ ํจ์๋ค์ ๊ด๋ฆฌํ๊ณ , ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์์ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ค์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์๋ณด์.
console.log('Hi');
setTimeout(function cb1() {
console.log('cb1');
}, 5000);
console.log('Bye');
1. ์ ์ผ ์ฒ์์๋ ์ฝ์, Call Stack ๋ฑ ๋ชจ๋ ๊ฒ์ด ๋น์์ง ์ํ๋ก ์์๋๋ค.
2. console.log('Hi')๊ฐ ํธ์ถ๋์ด Call Stack์ ์์ธ๋ค.
3. console.log('Hi')๊ฐ ์คํ๋์ด ์ฝ์์ Hi๊ฐ ์ฐํ๋ค.
4. console.log('Hi')๊ฐ ๋ฆฌํด๋๋ฉฐ Call Stack์์ ์ ๊ฑฐ๋๋ค.
5. setTimeout(function cb1() {...})๊ฐ ์คํ๋๋ฉด์ Call Stack์ setTimeoutํจ์๊ฐ ๋ค์ด๊ฐ๋ค.
6. setTimeoutํจ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฒ๋ฆฌํ์ง ์๊ณ Web API๊ฐ ์ฒ๋ฆฌํ๋ฏ๋ก Callbackํจ์๋ฅผ ์ ๋ฌํ๋ค. ๋ธ๋ผ์ฐ์ ๋ Wep API์ ์ผ๋ถ๋ก ํ์ด๋จธ๋ฅผ ๋ง๋ค๊ณ , Call Stack์ผ๋ก๋ถํฐ ์์ฒญ๋ฐ์ setTimeout์์ ์ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ ํ๋ค.
7. Call Stack์์๋ setTimeout์์ ์ด ์ ๊ฑฐ๋๋ค.
8. console.log('Bye')๊ฐ ํธ์ถ๋์ด Call Stack์ ์์ธ๋ค.
9. console.log('Bye')๊ฐ ์คํ๋์ด ์ฝ์์ Bye๊ฐ ์ฐํ๋ค.
10. console.log('Bye')๊ฐ ๋ฆฌํด๋๋ฉฐ Call Stack์์ ์ ๊ฑฐ๋๋ค.
11. Web API๊ฐ setTimeout์์ ์ ์คํํ๋ค. 5์ด ํ ํ์ด๋จธ๊ฐ ์๋ฃ๋๋ฉด cb1 Callbackํจ์๋ฅผ Task(Callback) Queue๋ก ๋ณด๋ธ๋ค.
12. Event Loop๋ Call Stack์ด ๋น์ด์์ผ๋ฉด Task(Callback) Queue์์ ํจ์๋ฅผ ํ๋์ฉ ๊บผ๋ด Call Stack์ ๋ฃ๋๋ค.
13. cb1์ด ์คํ๋๋ฉด์ console.log('cb1')์ด ํธ์ถ๋์ด Call Stack์ ์์ธ๋ค.
14. console.log('cb1')์ด ์คํ๋์ด ์ฝ์์ cb1์ด ์ฐํ๋ค.
15. console.log('cb1')์ด ๋ฆฌํด๋๋ฉฐ Call Stack์์ ์ ๊ฑฐ๋๋ค.
16. cb1์ด Call Stack์์ ์ ๊ฑฐ๋๋ฉฐ ๋ชจ๋ ์์ ์ด ์๋ฃ๋๋ค.
3. Promise
- ๋น๋๊ธฐ API ์ค ํ๋์ด๋ค.
- Job queue(microtask queue)๋ฅผ ์ฌ์ฉํ๋ค.
- Job queue๋ Task queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
-
setTimeout(() => {console.log("ํ์์์1");}, 0); Promise.resolve().then(() => console.log("ํ๋ก๋ฏธ์ค1")); setTimeout(() => {console.log("ํ์์์2");}, 0); Promise.resolve().then(() => console.log("ํ๋ก๋ฏธ์ค2")); // ํ๋ก๋ฏธ์ค1 ํ๋ก๋ฏธ์ค2 // ํ์์์1 ํ์์์2
- ๋น๋๊ธฐ ์์ ์ ํํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด
- ๋น๋๊ธฐ ์์ ์ ์งํ(Pending), ์ฑ๊ณต(Fulfilled, Resolved โก .then()), ์คํจ(Rejected โก .catch()) ์ํ๋ฅผ ํํ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์๋ฅผ ํํํ ์ ์๋ค.
3-1. Promise ์์ฑ์
- new Promise(callback)
- callback ํจ์๋ (resolve, reject) ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค.
- Promise ์ฑ๊ณต ์: resolve ํธ์ถ
- Promise ์คํจ ์: reject ํธ์ถ
-
let promise = new Promise((resolve, reject) => { if (Math.random() < 0.5) { return reject("์คํจ"); } resolve(10); });
- .then(): ์ฑ๊ณตํ์ ๋ ์คํํ ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ๋๊น
- .then(callback1, callback2)๋ก callback1์ ์๋ฆฌ์ ์ฑ๊ณต, callback2์ ์๋ฆฌ์ ์คํจ ๋ฉ์๋๋ฅผ ์ธ์๋ก ๋๊ธธ ์ ์๋ค.
- ex) .then(function onSuccess() {...}, function onFail() {...})
- .catch(): ์คํจํ์ ๋ ์คํํ ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ๋๊น
- .finally(): ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ์๊ด์์ด ๋ชจ๋ ์คํํ ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ๋๊น
- .all(): Promise์ ๋ฐฐ์ด์ ๋ฐ์ ๋ชจ๋ ์ฑ๊ณต ์ ๊ฐ Promise์ resolved๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐํ
- ํ๋์ Promise๋ผ๋ ์คํจํ ์, ๊ฐ์ฅ ๋จผ์ ์คํจํ Promise์ ์คํจ ์ด์ ๋ฅผ ๋ฐํ
-
Promise.all([promise1, promise2, promise3]) .then(values => {console.log("๋ชจ๋ ์ฑ๊ณต: ", values)}) .catch(e => {console.log("ํ๋๋ผ๋ ์คํจ: ", e)})
3-2. Promise ๋ฉ์๋ ์ฒด์ธ
- then/catch ๋ฉ์๋๊ฐ ๋ ๋ค๋ฅธ promise๋ฅผ ๋ฆฌํดํ์ฌ, ๋น๋๊ธฐ ์ฝ๋์ ์์๋ฅผ ๋ถ์ฌ
- ์ด๋ ๊ฒ ๋์ผํ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒ์ ์ฒด์ด๋(Chaining)์ด๋ผ ํ๋ค.
- ํจ์๋ฅผ ํธ์ถํ ์ฃผ์ฒด๊ฐ ํจ์๋ฅผ ๋๋ธ ๋ค ์๊ธฐ ์์ ์ ๋ฆฌํดํ๋๋ก ํ์ฌ ๊ตฌํํ๋ค.
์ฐธ๊ณ