๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„? ๋Ÿฐํƒ€์ž„? ์ด ๋‘ ์šฉ์–ด์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ํ–‡๊ฐˆ๋ฆฌ์‹œ๋Š” ๋ถ„์ด ๊ณ„์‹ค๊ฒ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์—”์ง„๊ณผ ๋Ÿฐํƒ€์ž„์„ ๋น„๊ตํ•ด๋ณด๊ณ  ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์—ญํ• , ์ถ”์ƒ์  ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

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 ๋“ฑ }
    • ํŠน์ • ์ด๋ฒคํŠธ(๋„คํŠธ์›Œํฌ ์‘๋‹ต, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฒคํŠธ ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€๊ธฐ์—ด
    • TQMessage Queue
  • Microtask Queue: ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ์งง์€ ์ž‘์—…๋“ค์ด ๋“ค์–ด๊ฐ€๋Š” ํ
    • MQ = { Promise.then(), async/await, MutationObserver ๋“ฑ }
    • MQJob Queue (JQ)
  • Render Queue: ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ž‘์—…์ด ๋“ค์–ด๊ฐ€๋Š” ํ
    • RQ = { ๋ Œ๋”๋ง, ์Šคํƒ€์ผ ๋ณ€๊ฒฝ }

 

ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Event Loop System (ELS) = { TQ, JQ = { MQ }, RQ }
  • Microtask Queue๋Š” Job Queue์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ
  • ์ด ๋ชจ๋“  ํ๋“ค์€ ์ด๋ฒคํŠธ ๋ฃจํ”„ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„œ๋กœ ์—ญํ• ์„ ๋ถ„๋‹ดํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•