์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํ์ง๋ง, ๋น๋๊ธฐ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ ๊ตฌ์ฑ ์์๋ค์ด ์ํธ์์ฉํฉ๋๋ค.
๊ด๋ จ ํค์๋
Call Stack
Heap
Web API
Task Queue (Macro Task Queue)
Microtask Queue
Event Loop
- Call Stack : ์คํ ์ค์ธ ํจ์ ํธ์ถ์ ๊ด๋ฆฌ.
- Heap : ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ด๋ฆฌ.
- Web API: : ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌ(๋ธ๋ผ์ฐ์ ์ ๊ณต).
- Task Queue (Macro Task Queue) : ๋น๋๊ธฐ ์์ ์ ์ฝ๋ฐฑ ๋๊ธฐ์ด.
- Microtask Queue : ์ฐ์ ์์๊ฐ ๋์ ๋น๋๊ธฐ ์์ ๋๊ธฐ์ด..
- Event Loop : ์คํ๊ณผ ํ ์ฌ์ด์ ์์ ์ด๋์ ์กฐ์ .
Call Stack (ํธ์ถ ์คํ)
์ฑ๊ธ ์ค๋ ๋์ด๋ฏ๋ก ํ ๋ฒ์ ํ๋์ ์์
๋ง ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. Heap์์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ฉฐ ๋๊ธฐ ์ฝ๋๋ฅผ ์คํํ๊ณ ๋น๋๊ธฐ ์์
์ Web API๋ก ๋๊ธฐ๊ณ , ์คํ์ ๋ฐ๋ก ๋ค์ ์์
์ ์ฒ๋ฆฌํฉ๋๋ค.
function a() { b(); }
a์ b๊ฐ ์คํ์ ์์ฐจ์ ์ผ๋ก ์์๋ค๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
Heap (ํ)
์ฃผ๋ก ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ(์: ๊ฐ์ฒด, ๋ฐฐ์ด, ํจ์ ๋ฑ)๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ตฌ์กฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก, ๋ณ์๋ ํจ์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์
(Garbage Collection)์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.Call Stack์์ ํจ์๊ฐ ํธ์ถ๋ ๋, ํจ์์ ๋ณ์๋ ๊ฐ์ฒด๋ Heap์ ์ ์ฅ๋๊ณ , ์คํ์ ๊ทธ ์ฐธ์กฐ๋ง ๊ฐ์ง๋๋ค.
let obj = { name: "myName" };
์ ์ฝ๋์์ obj๋ ์คํ์ ์ฐธ์กฐ๋ก ์ ์ฅ๋๊ณ , { name: "myName" }๋ Heap์ ์ ์ฅ๋๋ฉฐ ๋น๋๊ธฐ ์์
์์ ์์ฑ๋ ๊ฐ์ฒด(์: Promise ๊ฐ์ฒด)๋ Heap์ ์ ์ฅ๋๋ฉฐ, ์ดํ Microtask Queue๋ Task Queue์์ ์ฐธ์กฐ๋ฉ๋๋ค.
Web API
๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์ธ๋ถ์ ์กด์ฌํฉ๋๋ค. Call Stack์์ ๋น๋๊ธฐ ํจ์ ํธ์ถ ์, Web API๋ก ์์
์ ์์ํ๋ฉฐ ์์
์๋ฃ ํ ์ฝ๋ฐฑ์ Task Queue ๋๋ Microtask Queue์ ๋ฃ์ด์ค๋ค.
setTimeout(() => {}, 1000)
1์ด ํ ์ฝ๋ฐฑ์ Task Queue์ ์ถ๊ฐํด์ค๋ค.
Task Queue (Macro Task Queue)
Web API์์ ์๋ฃ๋ ๋น๋๊ธฐ ์์
(์: setTimeout, setInterval, I/O)์ ์ฝ๋ฐฑ์ด ๋๊ธฐํ๋ ํ์
๋๋ค. (FIFO ๋ฐฉ์) ์ด๋ฒคํธ ๋ฃจํ๊ฐ Call Stack์ด ๋น์์ ๋ Task Queue์์ ์์
์ ๊ฐ์ ธ์ ์คํ ํ ์ ์๋๋ก ํฉ๋๋ค. Microtask Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ์ต๋๋ค.
Microtask Queue (๋ง์ดํฌ๋ก ํ)
Promise์ .then, .catch, async/await, queueMicrotask ๋ฑ ์ฐ์ ์์๊ฐ ๋์ ๋น๋๊ธฐ ์์
์ ์ฝ๋ฐฑ์ด ๋๊ธฐํ๋ ํ์
๋๋ค. (FIFO ๋ฐฉ์) Task Queue์ ๋ณ๋๋ก ๊ด๋ฆฌ๋๋ฉฐ, Microtask๋ Call Stack์ด ๋น์์ ๋ ์ฆ์ ์คํ๋๋ฉฐ, Task Queue๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ํ ๋ฒ์ "ํฑ(tick)"์์ ๋ชจ๋ Microtask๋ฅผ ์ฒ๋ฆฌํ ํ Task Queue๋ก ๋์ด๊ฐ๋ค. Heap์ ์ ์ฅ๋ Promise ๊ฐ์ฒด๊ฐ ํด๊ฒฐ(resolve)๋๋ฉด, ํด๋น ์ฝ๋ฐฑ์ด Microtask Queue๋ก ์ด๋ํ๋ค.
console.log("Start"); setTimeout(() => console.log("Timeout"), 0); Promise.resolve().then(() => console.log("Promise")); console.log("End");
์ถ๋ ฅ: Start โ End โ Promise โ Timeout
์ด์ : Microtask Queue(Promise)๊ฐ Task Queue(setTimeout)๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋จ.
์ด์ : Microtask Queue(Promise)๊ฐ Task Queue(setTimeout)๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋จ.
Event Loop (์ด๋ฒคํธ ๋ฃจํ)
Call Stack, Microtask Queue, Task Queue๋ฅผ ๊ฐ์ํ๋ฉฐ ์์
์ ์ ์ ํ ์คํ์ผ๋ก ์ด๋์ํต๋๋ค.
๐ ๋์ ์์
- Call Stack์ด ๋น์๋์ง ํ์ธ.
- Microtask Queue์ ์์ ์ด ์์ผ๋ฉด ๋ชจ๋ ์ฒ๋ฆฌ(Heap์์ ๋ฐ์ดํฐ ์ฐธ์กฐ).
- Task Queue์์ ์์ ์ ํ๋์ฉ ๊บผ๋ด ์คํ.
Heap์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํ์ ๋๊ธฐ ์ค์ธ ์ฝ๋ฐฑ์ ์ฐ๊ฒฐํ๋ฉฐ, ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์ ๋น๋๊ธฐ ์์
์ ์กฐ์จํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ์ ์ฒด ํ๋ฆ
console.log("Start"); setTimeout(() => console.log("Timeout"), 0); Promise.resolve().then(() => console.log("Promise")); let obj = { message: "Heap" }; console.log(obj.message);
Heap
Heap: { message: "Heap" } ๊ฐ์ฒด๊ฐ Heap์ ์ ์ฅ๋๊ณ , obj๋ ์คํ์์ ์ฐธ์กฐํ๋ค.
Call Stack
- console.log("Start") ์คํ ํ ์ ๊ฑฐ.
- setTimeout ํธ์ถ โ Web API๋ก ์ด๋.
- Promise.resolve().then ํธ์ถ โ Promise ๊ฐ์ฒด๋ Heap์, .then ์ฝ๋ฐฑ์ Microtask Queue๋ก.
- console.log(obj.message) ์คํ ํ ์ ๊ฑฐ.
Web API
- setTimeout์ด 0์ด ํ ์ฝ๋ฐฑ์ Task Queue์ ์ถ๊ฐ.
Event Loop
- Call Stack ๋น์์ โ Microtask Queue์์ Promise ์ฝ๋ฐฑ ์คํ.
- Task Queue์์ Timeout ์ฝ๋ฐฑ ์คํ.
์ถ๋ ฅ
Start โ Heap โ Promise โ Timeout
์๋ฐ์คํฌ๋ฆฝํธ์ ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์ Call Stack์ผ๋ก ๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๊ณ , Heap์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, Web API, Task Queue, Microtask Queue, Event Loop๊ฐ ํ๋ ฅํ์ฌ ๋น๋๊ธฐ ์์
์ ํจ์จ์ ์ผ๋ก ์ํํฉ๋๋ค. ํนํ Microtask Queue๋ Promise์ ๊ฐ์ ์์
์ ์ฐ์ ์ฒ๋ฆฌํ๋ฉฐ, Heap์ ๋ชจ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ตฌ์กฐ ๋๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ UI ๋ฐ์์ฑ์ ์ ์งํ๋ฉด์ ๋ณต์กํ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ด๋ จ๊ฒ์๋ฌผ [์ด๋ฒคํธ ๋ฃจํ]: https://nam-yeun-hwa.github.io/posts/37