
JS๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ ํ๋ค.
๊ทธ ์ค์ฌ์๋ ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ(Event Loop)๋ผ๋ ๊ฐ๋ ์ด ์๋ค.
์ด๋ฒ ๊ธ์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ญ์ง,
call stack, task queue, microtask queue, Web APIs๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง
์ ํํ ์๊ณ ์ถ์ด์ ์ ๋ฆฌํ ๊ธ์ด๋ค.
๋์์ ํ ์ค์ฉ๋ง ์คํํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ป๊ฒ setTimeout๋ ๋๊ณ , fetch๋ ๋๊ณ , ํด๋ฆญ ์ด๋ฒคํธ๋ ์ฒ๋ฆฌ๋ ๊น?
๊ทธ๊ฑด JS๊ฐ Web API์ ๋น๋๊ธฐ ํ(Task Queue, Microtask Queue)๋ฅผ ํ์ฉํด์
์ค์ ๋ก๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
+------------------+ +---------------------+
| Call Stack |<----| Event Loop |
+------------------+ +---------------------+
^ ^ |
| | โ
+------------------+ +------------------+
| Task Queue |<-------| Web APIs (DOM, setTimeout, etc.)
+------------------+ +------------------+
^
|
+------------------+
| Microtask Queue |
| (Promise, queueMicrotask) |
+------------------+
console.log('์์');
setTimeout(() => {
console.log('setTimeout');
}, 0);
Promise.resolve().then(() => {
console.log('promise');
});
console.log('๋');
์์
๋
promise
setTimeout
console.log('์์') โ Call Stack ์คํ setTimeout โ Web API๋ก ๋๊ฒจ์ง โ Task Queue๋ก ๋๊ธฐ Promise.then โ Microtask Queue์ ๋ฑ๋ก๋จ console.log('๋') โ Call Stack ์คํ โ Microtask(Promise) โ Task(setTimeout) ์์๋ก ์คํ๋จ
| ๊ตฌ๋ถ | ์ค๋ช | ์์ |
|---|---|---|
| Microtask | ํ์ฌ ์คํ ๋๋๊ณ ๋ฐ๋ก ์คํ๋จ | Promise.then, queueMicrotask |
| Task | ๋ค์ ํฑ(tick)์์ ์คํ๋จ | setTimeout, setInterval, DOM ์ด๋ฒคํธ |
๋ฌธ์ : setState ๋ฐ๋ก ๋ค์์ ์ํ๊ฐ ์ ๋ฐ๋
setValue(1);
console.log(value); // ์ด์ ๊ฐ ์ถ๋ ฅ๋จ
์ด์ : setState๋ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ โ Microtask๋ก ์์ฝ๋จ
๊ทธ๋์ ์ฝ๋ ํ๋ฆ์์ ์์ง ๊ฐ์ด ๋ฐ๋์ง ์์ ์ํ์
โ ํด๊ฒฐ: useEffect, useLayoutEffect ๋ฑ์ผ๋ก ๋ฐ์ํ๊ฒ ๋ง๋ค๊ธฐ
์์งํ "JS๋ ์ฑ๊ธ ์ค๋ ๋๋๊น ๋๋ ค" ์ ๋๋ก๋ง ์๊ณ ์์๋๋ฐ,
์ด๋ฒ์ Event Loop ๊ตฌ์กฐ๋ฅผ ์ ๋๋ก ์ดํดํ๊ณ ๋๋๊น
๋น๋๊ธฐ ์ฝ๋๊ฐ ์ ๊ทธ๋ ๊ฒ ์คํ๋๋์ง ๋์ ๋ณด์ด๊ธฐ ์์ํ๋ค.
์ด์ ๋ setTimeout, Promise, fetch๋ฅผ ์ฐ๊ธฐ ์ ์
โ์ด๊ฑด ํ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๊ฒ ์งโ ํ๊ณ ํ๋ฆ์ด ๊ทธ๋ ค์ง๋ค.
๐ โ๋น๋๊ธฐ๋ฅผ ์๋ค๊ณ ๋งํ๋ ค๋ฉด, ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ทธ๋ฆด ์ ์์ด์ผ ํ๋ค.โ