-
๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฐ 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๋ถ๋ถํฐ
'๐ Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ