ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํฐ Event Loop ์ดํ•ด (feat. ๋ธŒ๋ผ์šฐ์ €, ๋Ÿฐํƒ€์ž„, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„)
    ๐ŸŽ Browser 2023. 2. 20. 15:47

     

    ๐ŸŽ ์†Œ๊ฐœ


    Event Loop๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ›จ~์”ฌ ๋” ํฐ ๋ฒ”์œ„์˜ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ํฉ์–ด์ ธ ์žˆ๋˜ ์กฐ๊ฐ๋“ค์ด ํ•œ ๊ณณ์— ๋ชจ์ธ ๋А๋‚Œ์ด๋ž„๊นŒ…?

    ๋‚˜๋งŒ ์ด๋Ÿฐ ๊ฑด์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ… ์–ด๋ฆด ๋•Œ๋ถ€ํ„ฐ ๋นจ๋ฆฌ, ๋งŽ์ด ์™ธ์›Œ์•ผํ•  ๋‹จ์–ด๋‚˜ ๊ฐœ๋…๋“ค์„ A4 ์šฉ์ง€์— ๊พธ๊ฒจ ๋„ฃ์€ ํ›„ ํ•œ๋ˆˆ์— ๋ณด๋ฉด ์ •๋ง ๋นจ๋ฆฌ ์™ธ์›Œ์กŒ๋‹ค. ์ด๋ฒˆ์— ํฉ์–ด์ง„ ๊ฐœ๋…์„ ํ•œ ๋ฐ๋กœ ๋ชจ์„ ๋•Œ ๋ชจ๋“  ์˜์—ญ์„ ํ•œ๋ˆˆ์— ๊ทธ๋ฆฌ๋ฉด ์ดํ•ด๊ฐ€ ๋” ์ž˜๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์— ๊ทธ๋ ค๋ณด์•˜๋‹ค. ์ด ๊ธ€์„ ์ฝ๋Š” ๋ถ„๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

     

     

    ๐ŸŽ ํผ์ฆ ๋ชจ์œผ๊ธฐ


    ์šฐ์„  ๋ธŒ๋ผ์šฐ์ €๋Š” html, css, javascript, static (img์™€ ๊ฐ™์€) ํŒŒ์ผ๋“ค์„ ๋‹ค์šด๋ฐ›์•„์™€ ํ™”๋ฉด์ƒ ๋ณด์—ฌ์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ง€๊ธˆ ๋‹น์‹ ์ด ์ด ๊ธ€์„ ์ฝ์œผ๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๊ทธ Chrome! ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €์ด๋‹ค.

    ์—ฌ๋Ÿฌ ํฌ์ŠคํŒ…์—์„œ ์•„์ฃผ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ์ง€๋งŒ, ๋ชจ๋“  ์„ค๋ช… ํ•˜๋‚˜์˜ ๋ทฐ๋กœ ๋ชจ์•„ ๊ทธ ์ดํ•ด๋ฅผ ํ† ๋Œ€๋กœ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค ๋ณด์•˜๋‹ค.

    top-down ์ˆœ์„œ๋กœ ํ•˜๋‚˜ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

     

     

    ๐ŸŽ ๋ธŒ๋ผ์šฐ์ € ๊ตฌ์กฐ?


    ์šฐ์„  ์ตœ์ƒ๋‹จ์— ๊ทธ๋ฆผ์„ ๋จผ์ € ๋ณด์ž. ๊ทธ๋ฆผ์—์„œ ์˜ˆ์ œ๋กœ ๋“  Chrome ๋ธŒ๋ผ์šฐ์ €๋Š”, ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์œผ๋กœ Chronium์„ ์“ฐ๊ณ , ๋Ÿฐํƒ€์ž„ ์—”์ง„์œผ๋กœ V8, ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ (Blink - Webkit์™€ ๊ฐ™์€ ๋ฟŒ๋ฆฌ๋ฅผ ๋‘” ์—”์ง„)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ธŒ๋ผ์šฐ์ €๋Š” ์—ฌ๋Ÿฌ ์—”์ง„๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ฐ ์—”์ง„์˜ ์—ญํ• ์„ ์‚ดํŽด๋ณด๋ฉด,

    • User Interface (์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค): ๋’ค๋กœ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ, ๋ถ๋งˆํฌ๋ฒ„ํŠผ ๋“ฑ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ํŽ˜์ด์ง€๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ง€์นญํ•œ๋‹ค
    • Browser Engine (๋ธŒ๋ผ์šฐ์ € ์—”์ง„): User Interface์™€ ๋ Œ๋”๋ง ์—”์ง„ ์‚ฌ์ด ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ์—”์ง„์ด๋‹ค
    • Rendering Engine (๋ Œ๋”๋ง ์—”์ง„): ์š”์ฒญํ•œ ์ž๋ฃŒ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์—”์ง„์ด๋‹ค. HTML ์š”์ฒญ์„ ๋ฐ›์•„์˜ค๋ฉด ๊ทธ๋ƒฅ ๋ณด์—ฌ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹ˆ์•ผ?!๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ›์•„์˜จ HTML ํŒŒ์ผ์„ ํ™”๋ฉด์ƒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„  ํŒŒ์‹ฑ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. <<**๋งํฌ์ถ”๊ฐ€>> ํฌ์ŠคํŒ…์— ์ •๋ฆฌ ํ•ด๋‘์—ˆ๋‹ค.
    • Networking (ํ†ต์‹ ): Http ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ (DevTools > Network)
    • UI Backend (UI ๋ฐฑ์—”๋“œ): ๊ธฐ๋ณธ์ ์ธ ์œ„์ ฏ์„ ๊ทธ๋ฆผ. eg. ์ฝค๋ณด๋ฐ•์Šค
    • JavaScript Interpreter (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ): ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰
    • Data storage (์ž๋ฃŒ ์ €์žฅ์†Œ): ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜๋Š” ์ €์žฅ์†Œ. e.g. ์ฟ ํ‚ค, localStorage, IndexedDB ๋“ฑ ์„ ์ง€์›

     

    ๐ŸŽ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ?


    ์ด์ œ down ํ•˜์œ„ ๋‹จ๊ณ„๋กœ ๋‚ด๋ ค๊ฐ€ ๋Ÿฐํƒ€์ž„ ์—”์ง„ (๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ)๋ฅผ ๋ด๋ณด์ž. ์ด ํ™˜๊ฒฝ์€ ์ด๋ฒค๋“œ๋“ค์„ ์Šค์ผ€์ฅด๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

    • JavaScript Engine: ์ด์–ด์ง€๋Š” ํŒŒํŠธ์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.
    • Web APIs: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ? ๊ฐœ๋…์œผ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฐ์ฒด (์ธํ„ฐํŽ˜์ด์Šค)์ด๋‹ค. Web APIs๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ฐจ๋ก€๋Œ€๋กœ ํƒœ์Šคํฌ ํ(Callback Queue, Job Queue)์— ์ถ”๊ฐ€๋œ๋‹ค.
      • ์‚ฌ์šฉ์ฒ˜:
        • ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋“œ๋œ ๋ฌธ์„œ ์กฐ์ž‘ (document.querySelector..)
        • ์›นํŽ˜์ด์ง€ ์ผ๋ถ€ ์—…๋ฐ์ดํŠธ (XMLHttpRequest ์‚ฌ์šฉ AJAX)
        • ๊ทธ๋ž˜ํ”ฝ ์š”์†Œ ์›นํŽ˜์ด์ง€๊ฒŒ ๊ทธ๋ฆฌ๊ธฐ (canvas)
        • ์›นํŽ˜์ด์ง€์—์„œ ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ์ž‘์—… (AudioContent)
        • ์›น ์ €์žฅ์†Œ (Window.sessionStorage, Window.localStorage)
        • ํƒ€์ž„์•„์›ƒ( Window.clearInterval, Window.setInterval, Window.setTimeout)
      •  ํŠน์ง•
        • Entry point๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ document, XMLHttpRequest, AudioContent, Window ์ด ๋ฐ”๋กœ entry point.
        • ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. onload, click ๋“ฑ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.
    • Callback Queue (Macro task queue): Web Api ์ค‘ setTimeout, setInterval, I/O tasks, setImmediate ์ด ๋ฐ˜ํ™˜ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
    • Job Queue (Micro task queue): es6์— promise๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋ฉด์„œ ๋“ฑ์žฅํ•œ ํ. *promise, process.nextTick ๋“ฑ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค. (*process.nextTick: process.nextTick ์•ก์…˜์˜ ์‹คํ–‰์„ ์ด๋ฒคํŠธ๋ฃจํ”„์˜ ๋‹ค์Œ ์ฐจ๋ก€๊นŒ์ง€ ์—ฐ๊ธฐํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ)
    • Event Loop: ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ฝœ๋ฐฑ ํ๋ฅผ ๊ณ„์† ์ฃผ์‹œํ•˜๊ณ  ์žˆ๋Š” ์žฅ์น˜์ด๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ฝœ๋ฐฑ ํ์— ๋“ค์–ด์˜จ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ ์Šคํƒ์— ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์ด๋™๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‹ค์‹œ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ Job Queue ๋‚ด ํƒœ์Šคํฌ๊ฐ€ ์ถ”๊ฐ€๋œ ํ›„ ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด, ์ดํ›„ Callback Queue์˜ ํƒœ์Šคํฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

     

    ๐ŸŽ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„?


    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„
      • ์ธํ„ฐํ”„๋ฆฌํ„ฐ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ๊ณ  ์‹คํ–‰ํ•œ๋‹ค.
      • ์ปดํŒŒ์ผ๋Ÿฌ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ง€๋งŒ, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ด์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” JIT(Just-In-Time) ์ปดํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. (์ฐธ์กฐ)
      • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
        • Code area: ์‹คํ–‰ํ•  JS ์ฝ”๋“œ ์ €์žฅ๋˜๋Š” ๊ณณ
        • Memory Heap: ๊ฐ์ฒด (์ฐธ์กฐ๊ฐ’)๋“ค์ด ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฐฝ๊ณ  + ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋‹ด๋‹นํ•จ. ๊ทธ๋ ‡๊ธฐ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํ•ญ์ƒ ๊ด€๋ฆฌํ•˜๋Š” ๊ณณ์ž„.
        • Call Stack: ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๋ฌธ๋งฅ์ด ์ˆœ์„œ๋Œ€๋กœ ์Œ“์ด๋Š” ์Šคํƒ. ์Šคํƒ ๋‚ด ์ตœ์ƒ๋‹จ ์‹คํ–‰ ๋ฌธ๋งฅ์„ ์‹œ์ž‘์œผ๋กœ return ๋ฌธ ์‹คํ–‰ ์‹œ pop ํ›„ ๊ทธ๋‹ค์Œ ๋ฌธ๋งฅ ์‹คํ–‰. (*์‹คํ–‰ ๋ฌธ๋งฅ: ์—”์ง„์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์ •๋ณด๋“ค. ๋ณ€์ˆ˜(์ง€์—ญ๋ณ€์ˆ˜|์›์‹œ๊ฐ’|์ฐธ์กฐ๊ฐ’์ด ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’), scope, this ์ด๋Ÿฐ ์ •๋ณด๋“ค์„ ๋‹ด์€ ๊ฐ์ฒด)

     

    ๐ŸŽ ์ž… ๊ทธ๋ž˜์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์™œ ์ค‘์š”ํ•œ๋ฐ?


    ์•ž์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ์ฆ‰ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋ฐ–์— ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์–ธ์–ด์ด๋‹ค. ๋”ฐ๋ผ์„œ…

    • ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•˜๋Š” ์‹คํ–‰๋ฌธ (api ์š”์ฒญ, ์ด๋ฏธ์ง€ ํ”„๋กœ์„ธ์‹ฑ)์˜ ๊ฒฝ์šฐ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์‹œ ๊ทธ๋‹ค์Œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์—†์–ด ๊ทธ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“  ๋™์ž‘์ด ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค
    • ์ด๋ฅผ ๋ชจ๋ฅด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํด๋ฆญํ•œ๋‹ค๋ฉด ๋ชจ๋“  ์š”์ฒญ์ด ๋๋‚œ ํ›„ ์ด ์š”์ฒญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์›น์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ•œ๋‹ค

    ์ด ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์–ธ์–ด์˜ ๋‹จ์ ์—์„œ ๋ฐ”๋ผ๋ณธ๋‹ค๋ฉด, Web Api๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์šฐ์„ ์ˆœ์œ„์— ๋งž๊ฒŒ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค๋Š” ์ธก๋ฉด์—์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š”, “์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์–ธ์–ด์˜ ์ œ์•ฝ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ”๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๊ฒ ๋‹ค! ๋•…๋•…๋•…

     

     

     

     

     

     

    ์ฐธ๊ณ ์ž๋ฃŒ:

    https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management

    https://developer.mozilla.org/ko/docs/Glossary/Call_stack

    https://web.dev/howbrowserswork/

    https://dev.to/sanderdebr/a-brief-explanation-of-the-javascript-engine-and-runtime-2idg

    ํ˜ธ์ถœ ์Šคํƒ, Web APIs, Callback Queue, Event Loop ๋™์ž‘ ์ˆœ์„œ ์‹œ๋ฎฌ๋ ˆ์ดํŒ… ์˜์ƒ. 11๋ถ„๋ถ€ํ„ฐ

Designed by Tistory.