์๋ฐ์คํฌ๋ฆฝํธ ์์ง? ๋ฐํ์? ์ด ๋ ์ฉ์ด์ ์ฐจ์ด์ ๋ํด ํ๊ฐ๋ฆฌ์๋ ๋ถ์ด ๊ณ์ค๊ฒ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ง๊ณผ ๋ฐํ์์ ๋น๊ตํด๋ณด๊ณ ์ด๋ฒคํธ ๋ฃจํ์ ์ญํ , ์ถ์์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์์ง
- ์ญํ
- ECMAScript(ECMA-262 ํ์ค)์ฝ๋๋ฅผ ํ์ฑํ๊ณ ์คํํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๋ค.
- ๊ตฌ์ฑ์์
- ํ์: ์์ค ์ฝ๋๋ฅผ AST(Abstract Syntax Tree)๋ก ๋ณํ.
- ์ปดํ์ผ๋ฌ: AST๋ฅผ ์ต์ ํ๋ ๋ฐ์ดํธ์ฝ๋ ๋๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผ.
- ๊ฐ์ ๋จธ์ (VM): ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์คํ. JIT(Just-In-Time) ์ปดํ์ผ๋ง์ ํตํด ์ฑ๋ฅ ์ต์ ํ.
- ์ฃผ์ ์์ง
- V8: Google Chrome, Node.js์ ์ฌ์ฉ
- SpiderMonkey: Mozilla Firefox์ ์ฌ์ฉ
- JavaScriptCore: Safari ๋ฐ iOS์์ ์ฌ์ฉ
- V8 ์์ง
- V8์ ๊ตฌ๊ธ์ด ๊ฐ๋ฐํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์คํํ๋ ์ญํ ์ ํฉ๋๋ค.
- V8์ ๋จ์ผ ์ค๋ ๋์์ ๋์ํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ V8์ ์ฑ ์์ ๋๋ค.
- V8์ ๋จ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ์คํ์ ์ฒ๋ฆฌํ๋ ์์ง์ผ ๋ฟ, ๋น๋๊ธฐ ์์ ์ด๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ด๋ฆฌํ์ง๋ ์์ต๋๋ค.
2. ๋ฐํ์
- ์ญํ
- ์์ง์ ํฌํจํ ECMAScript ์คํ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
- ํ๋ซํผ์ ๋ฐ๋ผ ์ถ๊ฐ์ ์ธ ๋นํ์ค API(DOM, fs)๋ฅผ ์ ๊ณตํ๋ค.
- ๊ตฌ์ฑ์์
- ์์ง: ECMAScript ์คํ ๋ด๋น
- ์ด๋ฒคํธ ๋ฃจํ: ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌ, ์ฝ๋ฐฑ ํจ์ ์คํ ์์ ์ ์ด
- ํธ์คํธ API: ๋ธ๋ผ์ฐ์ ์ DOM API, ์๋ฒ์ ํ์ผ ์์คํ API ๋ฑ ์ถ๊ฐ ๊ธฐ๋ฅ ์ ๊ณต
- ์ฃผ์ ๋ฐํ์
- ๋ธ๋ผ์ฐ์ : DOM, BOM, fetch API ๋ฑ ์น ๊ด๋ จ API ์ ๊ณต
- Node.js: ํ์ผ ์์คํ , ๋คํธ์ํฌ I/O, ํ๋ก์ธ์ค ๊ด๋ฆฌ ๋ฑ ์๋ฒ ๊ด๋ จ API ์ ๊ณต
- Deno/Bun: Node.js์ ์ ์ฌํ์ง๋ง ํ์ผ ์์คํ , ๋ณด์ ๋ชจ๋ธ ๋ฑ์์ ์ฐจ๋ณํ๋ API ์ ๊ณต
3. ์ด๋ฒคํธ ๋ฃจํ๋ ์ด๋์ ํฌํจ๋์ด ์๋๊ฐ?
- Node.js ํ๊ฒฝ
- Node.js๋ libuv๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. Node.js์ ์ด๋ฒคํธ ๋ฃจํ๋ ํ์ผ I/O, ๋คํธ์ํฌ, ํ์ด๋จธ, ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํ๋ฉฐ, ์์ ์ด ์๋ฃ๋๋ฉด V8์์ ํด๋น ์์ ์ ์ฝ๋ฐฑ์ ์คํํ๊ฒ ๋ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ
- HTML ๋ช ์ธ์ ์ด๋ฒคํธ ๋ฃจํ ์คํ์ ๋ฐ๋ฅด์ง๋ง, ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๊ฐ์ ๋ค๋ฆ ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ณ๋์ ๊ณต๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ๋ด๋ถ ๊ตฌํ์ด ๋ธ๋ผ์ฐ์ ์ฝ๋์ ๊ธด๋ฐํ๊ฒ ํตํฉ๋์ด ์์ด, Node.js์ฒ๋ผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋ ๋ชจ๋๋ก ์กด์ฌํ์ง ์์ต๋๋ค.
- ๊ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒด์ ์ผ๋ก ๊ตฌํํ๊ณ ์๊ณ , ๊ทธ ๊ตฌํ์ด ๋ธ๋ผ์ฐ์ ์ฝ๋์ ๊น์ด ํตํฉ๋์ด ์์ต๋๋ค.
์ฆ, ์ด๋ฒคํธ ๋ฃจํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์(๋ธ๋ผ์ฐ์ , Node.js ๋ฑ)์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(V8)์ ์ด๋ฒคํธ ๋ฃจํ์์ ํธ์ฌํ ์ฝ๋ฐฑ์ ์คํํ๋ ์ญํ ์ ํฉ๋๋ค.
4. ์ด๋ฒคํธ๋ฃจํ์ ๊ตฌ์กฐ
flowchart TB
subgraph ELS["Event Loop System (ELS)"]
subgraph TQ["Task Queue (TQ)"]
setTimeout["setTimeout"]
setInterval["setInterval"]
IO["I/O Operations (File, Network)"]
XHR["XHR Requests (Ajax, Fetch)"]
UIEvents["UI Events (Click, Keypress)"]
end
subgraph JQ["Job Queue (JQ)"]
subgraph MQJ["Microtask Queue (MQJ)"]
PromiseThen["Promise.then()"]
AsyncAwait["async/await"]
MutationObserver["MutationObserver"]
QueueMicrotask["queueMicrotask()"]
end
end
subgraph RQ["Render Queue (RQ)"]
Layout["Layout Calculation"]
Paint["Paint (Rasterization)"]
Composite["Compositing"]
StyleRecalc["Style Recalculation"]
CSSAnimation["CSS Animation"]
Transition["CSS Transition"]
end
end
- ์ ์ฒด ์ด๋ฒคํธ ๋ฃจํ ์์คํ
์ ํํํ๋ ์งํฉ
- Event Loop System, ELS = { Task Queue, Microtask Queue, Render Queue }
- Task Queue: ๋์ ์๋ฏธ์์ ๋น๋๊ธฐ ์์
์ ์๋ฃ ํ ์คํ๋ ์ผ๋ฐ์ ์ธ ํ์คํฌ๋ค, ์ฝ๋ฐฑ๋ค์ด ๋๊ธฐํ๋ ํ
- TQ = { setTimeout, setInterval, I/O, XHR Requests ๋ฑ }
- ํน์ ์ด๋ฒคํธ(๋คํธ์ํฌ ์๋ต, ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ด๋ฒคํธ ๋ฑ)๋ฅผ ์ฒ๋ฆฌํ๋ ๋น๋๊ธฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ์ด
- TQ ⊆ Message Queue
- Microtask Queue: ์ฆ์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ์งง์ ์์
๋ค์ด ๋ค์ด๊ฐ๋ ํ
- MQ = { Promise.then(), async/await, MutationObserver ๋ฑ }
- MQ ⊆ Job Queue (JQ)
- Render Queue: ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์
์ด ๋ค์ด๊ฐ๋ ํ
- RQ = { ๋ ๋๋ง, ์คํ์ผ ๋ณ๊ฒฝ }
ํ๋ง๋๋ก ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- Event Loop System (ELS) = { TQ, JQ = { MQ }, RQ }
- Microtask Queue๋ Job Queue์ ๋ถ๋ถ์งํฉ
- ์ด ๋ชจ๋ ํ๋ค์ ์ด๋ฒคํธ ๋ฃจํ ์์คํ ๋ด์์ ์๋ก ์ญํ ์ ๋ถ๋ดํฉ๋๋ค.
๋ฐ์ํ