
1. JavaScript Runtime ๊ตฌ์ฑ ์์
๋ธ๋ผ์ฐ์ ๋ด์ JavaScript *๋ฐํ์์ ํฌ๊ฒ JavaScript ์์ง๊ณผ ์น API๋ก ๊ตฌ์ฑ๋์ด์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ํ ์คํฌ ํ์ ์ด๋ฒคํธ ๋ฃจํ๋ผ๋ ๊ฐ๋ ๋ํ ์กด์ฌํ๋ค. ์ด๋ฅผ ํตํด ์ฑ๊ธ ์ฐ๋ ๋ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ ๋ถ๋ฆฌ๋ JavaScript๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํ์ํฌ ์ ์๊ฒ ๋๋ค.
*๋ฐํ์: ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๊ฐ ๊ตฌ๋๋๋ ํ๊ฒฝ

2. JavaScript ์์ง
JavaScript ์ฝ๋๋ฅผ ์ฝ๊ณ , ํด์, ์คํ์ ๋ด๋นํ๋ ์ธํฐํ๋ฆฌํฐ์ด๋ค. ์ฐ๋ ๋ ํ๋๋ก๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ์คํ ์์ญ๋ ๋จ ํ๋๋ง ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ก ์ธํด ํ๋์ ํจ์๊ฐ ์คํ์ด ๋๋๊ธฐ ์ ์๋ ๋ค๋ฅธ ํจ์๊ฐ ์คํ๋ ์ ์๋ "Run to Completion" ํน์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
JavaScript ์์ง์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋ ๊ฐ์ง ์์ญ
1) ํ ์์ญ
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ์์ญ
- ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ค์ ํ ๋นํ๋ ๊ณณ
- ๊ตฌ์กฐํ๋์ง ์์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ง์นญํ๋ค.
- ex) ๋ณ์ ํ ๋น์ ๊ด๋ จ ์ ๋ณด ์ ์ฅ
2) ์คํ ์์ญ
- ์คํํ ํ ์คํฌ๋ฅผ ๊ด๋ฆฌํ๋ ์์ญ
- ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ํด๋น ์คํ ํ๋ ์์ด ํธ์๋๊ณ ,
- ํจ์๊ฐ ์ข ๋ฃ๋ ๋๋ง๋ค ํด๋น ์คํ ํ๋ ์์ด ํ ๋๋ ์์ญ์ ์ง์นญํ๋ค.
- ex) ํจ์ ํธ์ถ ์ ์คํ์ ์์

์คํ ์์ญ์ ํธ์๋๋ ํจ์์ ์คํ ํ๋ ์์ ๊ทธ ํจ์์ ์คํ ๋งฅ๋ฝ(Execution Context)์ ์๋ฏธํ๋ค. ์คํ ๋งฅ๋ฝ์ด๋, ํด๋น ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ ๊ฐ์ข ์ ๋ณด๋ค(ex. ์ง์ญ ๋ณ์)์ ์งํฉ์ด๋ค. JavaScript ์์ง์ JavaScript ์ฝ๋์ ์คํ์ ์์ํจ๊ณผ ๋์์ ์ ์ญ ์คํ ๋งฅ๋ฝ(Global Execution Context)์ ์คํ ์์ญ์ ํธ์ํ๊ณ , ์ดํ ํน์ ํจ์์ ํธ์ถ ๋ฌธ์ ๋ง๋๋ ์๊ฐ ๊ทธ ํจ์์ ์คํ ๋งฅ๋ฝ์ ์คํ ์์ญ์ ํธ์ํ๊ณ ๊ทธ ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ๊ทธ ์คํ ๋งฅ๋ฝ์ ํ ํ๋ค.
JavaScript ์ฝ๋์ ์คํ์ด ์ ๋ถ ๋ค ๋๋๊ธฐ ์ ๊น์ง๋ ์ ์ญ ์คํ ๋งฅ๋ฝ์ด ์คํ ์์ญ์์ ํ ๋์ง ์๊ณ ๋จ์ ์๋ค. ์ด๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ ๋ค์์ ์ค๋ช ํ "์คํ์ด ๋น๋ ์๊ฐ"์ด๋ผ๋ ๋ง์ ์๋ฏธ๋ฅผ ์กฐ๊ธ ๋ ๋ช ํํ ์ดํดํ ์ ์๋ค. ์ฆ, ์คํ์ด ๋น๋ ์๊ฐ์ด๋ผ๋ ๊ฒ์ ๊ฒฐ๊ตญ ๋ ์ด์ ์คํํ JavaScript ์ฝ๋๊ฐ ์์ด์ ์ ์ญ ์คํ ๋งฅ๋ฝ๊น์ง ์คํ ์์ญ์์ ํ์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.

3. ๋น๋๊ธฐ ๋ฐฉ์ Event loop๋ก Javascript์ ๋์์ฑ์ ์ง์ํ๋ค.

์ด๋ฒคํธ ๋ฃจํ(Event Loop)๋ฅผ ์ด์ฉํด์ callback queue(๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ํ ์ด๋ฒคํธ) ๋ฅผ call stack์ ๋ณด๋ธ๋ค. call stack์ ์ง์ผ๋ณด๊ณ ์๋ค๊ฐ, ์คํ์ด ๋น๋ ์๊ฐ callback queue์์ callback function์ ๊บผ๋ด์ ์คํ์์ผ์ฃผ๋ ์ผ๋ง ํ๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ๊ณ์ stack์ empty ์ฌ๋ถ๋ง์ ์ ๊ฒฝ์ฐ๊ธฐ ๋๋ฌธ์, ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ์ค์ธ ํ์คํฌ๊ฐ call stack์ ์๋์ง, ์๋์ง๋ฅผ ํ์ธํ๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฅ์์๋ single thread ๋ก ์ฒ๋ฆฌ์ค์ธ javascript๊ฐ ๋ง์น ๋์์ ์ฒ๋ฆฌ๋๊ณ ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค.
๊ตฌ๋ํ๊ฒฝ ์ ๋๋ฉ์ด์ ๋ณด๊ธฐ: https://www.jsv9000.app/
4. Web APIs
Web api๋?
์น API๋ JavaScript ์์ง์ ๋ฐ๊นฅ์ ์์นํ๋ค. Ajax ์์ฒญ, setTimeout(), ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ฑ๋ก๊ณผ ๊ฐ์ด ์น ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๋งํ๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ํ ๊ฒ์ ์ด๋ฌํ ์์ฒญ๋ค์ ์ฒ๋ฆฌ๊ฐ JavaScript ์์ง์ ์ฐ๋ ๋์๋ ๋ค๋ฅธ ์ฐ๋ ๋๋ค์์ ์ด๋ค์ง๋ค๋ ์ ์ด๋ค. JavaScript ์์ง์ ์คํ์์ ์คํ๋ ๋น๋๊ธฐ ํจ์๊ฐ ์์ฒญํ๋ ๋น๋๊ธฐ ์์ ์ ๋ํ ์ ๋ณด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์น API๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์๊ฒ ๋๊ธฐ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ์์ฒญ๋ค์ ๋ณ๋์ ์ฐ๋ ๋์ ์์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ์ฐ๋ ๋๋ ํด๋น ์์ฒญ์ด ์๋ฃ๋๋ ์๊ฐ ์ ๋ฌ๋ฐ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ JavaScript ์์ง์ ํ์คํฌ ํ๋ผ๋ ๊ณณ์ ์ง์ด๋ฃ๋๋ค.

์๋ฅผ ๋ค์ด, setTimeout() ํจ์๊ฐ ์คํ๋๋ฉด JavaScript ์์ง์ ์น API๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์๊ฒ setTimeout() ์์ ์ ์์ฒญํ๋ฉด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๊ณ , ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ํ์ด๋จธ ์์ ์ ๋ณ๋์ ์ฐ๋ ๋์๊ฒ ์์ํ๋ค. ๊ทธ๋ฌ๊ณ ๋๋ฉด JavaScript ์์ง์ ์คํ์์๋ setTimeout() ํจ์์ ์คํ ํ๋ ์์ด ์ฆ์ ํ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์๋ก ๋ช ์ํ ์๊ฐ์ด ํ๋ฅด๊ณ ๋๋ฉด ํด๋น ํ์ด๋จธ ์์ ์ ์ฒ๋ฆฌํ๊ณ ์๋ ์ฐ๋ ๋๋ ์ ๋ฌ๋ฐ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ JavaScript ์์ง์ ํ์คํฌ ํ์ ์ง์ด๋ฃ๊ฒ ๋๋ค.
5. ์ด๋ฒคํธ ๋ฃจํ (Event Loop)
ํํธ, ์์ ๊ฐ์ ๋์์ด ๊ฐ๋ฅํ๋ ค๋ฉด ๋งค ์๊ฐ ์คํ์ด ๋น์ด์๋์ง ์ฌ๋ถ์ ํ์คํฌ ํ์ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ๋ง ํ๋ค. ์ด๋ฌํ ์ญํ ์ ์ํํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ์ด๋ค. ์ฆ, ์ด๋ฒคํธ ๋ฃจํ๋ ๋งค ์๊ฐ ์คํ์ด ๋น์ด์๋์ง ํ์ธ์ ํด์ ์คํ์ด ๋น์ด์๋ค๋ฉด ํ์คํฌ ํ์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ค์ด์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฒซ ๋ฒ์งธ๋ก ๋ค์ด์ค๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํ์ ์๋ ์ญํ ์ ํ๋ค. ๋ง์ฝ ์คํ์ด ๋น์ด์์ง ์๋ค๋ฉด ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์คํ์์ ํจ์์ ํธ์ถ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. ๊ฒฐ๊ตญ ์ด๋ฒคํธ ๋ฃจํ๋ ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ ์์ ์ ๋ฌดํํ ๋ฐ๋ณตํ๋ ๋ฌดํ ๋ฃจํ๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค. ์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ๋งค ์๊ฐ ํ์คํฌ ํ์ ์คํ์ ํ์ธํ๋ ์์ ์ ํฑ(Tick)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ฒคํธ ๋ฃจํ์ ๋์ ๋ฐฉ์์ ๊ฐ์์ ์ฝ๋๋ก ์ค๋ช ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ๋ค(์ถ์ฒ : MDN).
while (queue.waitForMessage()) {
queue.processNextMessage();
}
The event loop facilitates this process; it constantly checks whether or not the call stack is empty. If it is empty, new functions are added from the event queue. If it is not, then the current function call is processed. (๋ฐ์ท)
6. ์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ชจ๋ธ
- ์ฌ๋ฌ ํ์๊ฒ ์์ ์ ์ง์ํ ํ, ๊ทธ ํ๋ค์ด ์์ ์ ์๋ฃํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณด๊ณ ํ์ ์กฐ์น๋ฅผ ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๋ฉ์ธ ์ค๋ ๋(๋งค๋์ )๋ ์ค์ ์์ ์ ํ์ง ์๊ณ , ์์ ์ ๋ถ๋ฐฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
- ๋ฉ์ธ ์ค๋ ๋๋ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์ ธ์ค.
- ๊ฐ ์์ ์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ ํตํด ๋ค์ ๋ฉ์ธ ์ค๋ ๋์์ ์ฒ๋ฆฌ.
์ฃผ์ ์ฅ์
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ค์ ๋ก ๋ฌด๊ฑฐ์ด ์์ ์ ์ง์ ํ์ง ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ๋ค์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ์์ ์ ํจ์จ์ ๊ด๋ฆฌ: ๋ฉ์ธ ์ค๋ ๋๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ๋๋ง๋ค ์ฝ๋ฐฑ์ ์์๋๋ก ์ฒ๋ฆฌํ์ฌ ํจ์จ์ ์ธ ์คํ ํ๋ฆ์ ์ ์งํฉ๋๋ค.
๊ฒฐ๋ก
- ๋ฉ์ธ ์ค๋ ๋์ ํต์ฌ ์ญํ ์ ์์ ์ ์ธ๋ถ ์ฐ๋ ๋์ ์์ํ๊ณ ๊ทธ ์์ ์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋ ๋ชจ๋ธ์ ์ ์งํ๋ฉด์๋, ๋น๋๊ธฐ์ ์ธ ๋นํจ์จ์ ์ต์ํํ๊ณ , ๋์์ฑ์ ํ์ฉํ์ฌ ๋ณต์กํ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ ๋ค์ํ ์์ ์ ์ต๋ํ ์ญํ ๋ณ๋ก ์ฌ๋ฌ ์ฐ๋ ๋์ ๋ถ์ฐ์์ผ ๋ณ๋ ฌ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.์ต์ข ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋๋ ํน์ ํ ํต์ฌ ์ญํ ์ ๋งก๊ณ ์์ต๋๋ค.
7. ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ์ฐ๋ ๋
๋ธ๋ผ์ฐ์ ๋ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ์ํด ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด:
- ๋ ๋๋ง ์์ง: ๋ ์ด์์ ๊ณ์ฐ, ํ์ธํ , ์ปดํฌ์งํ ์์ ๋ฑ์ ์ฒ๋ฆฌํ๋ ๋ ๋๋ง ๊ด๋ จ ์ฐ๋ ๋.
- ๋คํธ์ํฌ ์ฐ๋ ๋: ๋คํธ์ํฌ ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ (XHR, Fetch API ๋ฑ).
- ์ ์ถ๋ ฅ(I/O) ์ฐ๋ ๋: ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๋ฑ๊ณผ ๊ฐ์ I/O ์์ .
- ํ์ด๋จธ ์ฐ๋ ๋: setTimeout, setInterval ๊ฐ์ ํ์ด๋จธ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ด๋ฆฌ.
- GPU ์ฐ๋ ๋: ๊ทธ๋ํฝ ๋ ๋๋ง, ํ๋์จ์ด ๊ฐ์ ์์ ๋ฑ์ ๋ด๋นํ๋ GPU ๊ด๋ จ ์ฐ๋ ๋.
- Compositor ์ฐ๋ ๋: ํ๋ฉด์ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ์กฐํฉํด ์ต์ข ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ ๋๋งํ๋ ์ฐ๋ ๋.
์ด ์ธ์๋, ๋ธ๋ผ์ฐ์ ๋ ๋น๋๊ธฐ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋๋ฅผ ํ์ฉํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋
- ์์
์์
- ๋ฉ์ธ ์ค๋ ๋๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ (์: ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ ์ถ๋ ฅ, ๋ ๋๋ง ๋ฑ)์ ํด๋นํ๋ ์ฐ๋ ๋์ ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, XHR์ด๋ fetch ์์ฒญ์ ๋ณด๋ด๋ฉด, ๋ฉ์ธ ์ค๋ ๋๋ ํด๋น ์์ฒญ์ ๋คํธ์ํฌ ์ฐ๋ ๋๋ก ๋๊ธฐ๊ณ ์ฆ์ ๋ค์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ์์
๊ด๋ฆฌ
- ์์ ์ ๋ค๋ฅธ ์ฐ๋ ๋๋ก ๋๊ธด ํ, ๋ฉ์ธ ์ค๋ ๋๋ ์ฆ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ๊ณ์ํด์ ์คํํฉ๋๋ค. ์ด ๋๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์์ ์ผ๋ก ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฝ๋ฐฑ ์ฒ๋ฆฌ
- ๋ค๋ฅธ ์ฐ๋ ๋์์ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๋ฉด, ํด๋น ์์ ์ ๊ฒฐ๊ณผ๋ ์ฝ๋ฐฑ ํํ๋ก ๋ฉ์ธ ์ค๋ ๋์ ์ ๋ฌ๋ฉ๋๋ค. ์ด ๋ ๋ฉ์ธ ์ค๋ ๋๋ Task Queue๋ Microtask Queue์ ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฐจ๋ก๋๋ก ์คํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, setTimeout์ด๋ Promise๊ฐ ์๋ฃ๋๋ฉด ๊ทธ ์ฝ๋ฐฑ์ด ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค.
- DOM ์กฐ์ ๋ฐ UI ์
๋ฐ์ดํธ
- ๋ฉ์ธ ์ค๋ ๋๋ DOM ์กฐ์๊ณผ UI ์ ๋ฐ์ดํธ๋ ๋ด๋นํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋ ํผ์ ์ ์ถํ๋ ๋ฑ์ UI ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ทธ์ ๋ฐ๋ฅธ DOM ๋ณ๊ฒฝ ์์ ๋ ๋ฉ์ธ ์ค๋ ๋์์ ์ด๋ฃจ์ด์ง๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ๋ค์ํ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋จ์ผ ์ค๋ ๋๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ ํ์ ๋๊ธฐ ์ค์ธ ์์ ๋ค์ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค.
- ๋ณ๋ชฉ ํ์ ๋ฐฉ์ง: ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ์ฐ๋ ๋๋ ๋คํธ์ํฌ ์์ฒญ, ๋ ๋๋ง, I/O ์์ ๋ฑ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จ์ผ ์ค๋ ๋๋ ์๋ฃ๋ ๋น๋๊ธฐ ์์ ์ ์ฝ๋ฐฑ๋ง ์ฒ๋ฆฌํ๋ฏ๋ก ๋ณ๋ชฉ ํ์์ ์ค์ ๋๋ค.
8. ํ์คํฌ ํ (Task Queue)
ํ์คํฌ ํ๋ ์น API๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋ ์ฐ๋ ๋๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑ ํจ์๋ค์ FIFO(First-In First-Out) ๊ตฌ์กฐ๋ก ์ ์ฅํ๊ณ ์๋ ์ผ์ข ์ ํ(Queue)๋ก, JavaScript ์์ง ์์ฒด์ ํฌํจ๋์ด ์๋ ๋ถ๋ถ์ด๋ค. ์ฌ๊ธฐ์ ์ ์ฅ๋ ์ฝ๋ฐฑ ํจ์๋ค์ ์คํ์ด ๋น๋ ์๊ฐ ์คํ์ ์์๋๋ก ํธ์๋๋ค. ์ด๋ฌํ ์๋ฆฌ๋ก ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ์ดํ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋์ด ํ์คํฌ ํ์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ค์ด๊ฐ ์๋๋ผ๋ ์คํ์ด ๋น์ด์์ง ์๋ค๋ฉด ํด๋น ์ฝ๋ฐฑ ํจ์๊ฐ ๋ฐ๋ก ์คํ๋์ง ๋ชปํ๋ค๋ ํน์ง์ด ์๋ค. ๊ทธ๋์ setTimeout() ํจ์๋ ์ธ์๋ก ๋ช ์ํ ์๊ฐ์ '์ ๋๋ ์ต์ ์๊ฐ'์ผ ๋ฟ, ๊ทธ๊ฒ๋ณด๋ค ๋ ์ค๋ ์ ๋ค ์ ์๋ค.
*์ฌ๊ธฐ์ ๋งํ๋ ํ์คํฌ๋ ๊ณง ์ฝ๋ฐฑ ํจ์๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์, ํ์คํฌ ํ๋ ์ฝ๋ฐฑ ํ(Callback Queue)๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์ด๋ฒคํธ ํ, ๋ฉ์ธ์ง ํ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. (์ฝ์คํ์ด ๋น์ด์์ ๊ฒฝ์ฐ์ ๋ฑ๋ก๋ ํจ์๋ฅผ ์ฝ์คํ์ ์ถ๊ฐ)
9. ์ก ํ (Job Queue)
ECMA 2015 ์์ ๋์จ ๊ฐ๋ ์ผ๋ก Promises์ ์ํด ์ฌ์ฉ๋๋ค. promises๋ async ํจ์๋ฅผ ์ฝ์คํ์ ๋ฃ๋ ๋์ ์ ๊ฐ๋ฅํ ๋นจ๋ฆฌ ์คํํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค. Promises ๋ ํ์ฌ ํจ์๊ฐ ๋๋๊ธฐ ์ ์ resolve ๋ํ ํ์ฌ ํจ์๊ฐ ๋๋์๋ง์ ๋ฐ๋ก ์คํ๋๋ค. job queue๋ event queue ๋ณด๋ค ์ฐ์ ๊ถ์ ๊ฐ์ง๊ณ ์์ด event queue์ ์์ธ ํจ์๋ณด๋ค ๋จผ์ ์คํ๋๋ค. (์์ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ์ฝ์คํ์ด ๋น์ด์์ง ์๋๋ผ๋ ์กํ์ ๋ฑ๋ก๋ ์ฝ๋ฐฑ์ ์ฝ์คํ์ ์ถ๊ฐ)
const task = () => console.log('task');
const job = () => console.log('job');
const run = () => {
console.log('callStack');
setTimeout(task, 0);
new Promise((resolve, reject) => resolve('job'))
.then((resolve) => job());
};
run();
// 'callStak'
// 'job'
// 'task'
์์ฝ
๋ธ๋ผ์ฐ์ ๋ ๋๋ถ๋ถ์ ๋ฌด๊ฑฐ์ด ์์ (๋ ๋๋ง, ๋คํธ์ํฌ, I/O ๋ฑ)์ ๋ณ๋์ ์ฐ๋ ๋๋ก ๋ถ๋ฆฌํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ผ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ ๋์์ ์ฝ๋ฐฑ ํจ์๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๋จ์ผ ์ค๋ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ, ์ด๋ฒคํธ ๋ฃจํ ๊ด๋ฆฌ, DOM ์กฐ์ ๋ฑ์ ๋ด๋นํ๋ฉฐ, ๋น๋๊ธฐ ์์ ์ ์ฝ๋ฐฑ์ ์์ฐจ์ ์ผ๋ก ์คํํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๋งค๋๋ฝ๊ฒ ๋์ํ ์ ์๋๋ก ํฉ๋๋ค.
๋ฉ์ธ ์ค๋ ๋(์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋)**์ ์ฃผ๋ ์ญํ ์ ์ฌ๋ฌ ์์ ์ ์ ์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋๋ ์์คํ ์์ ์์๊ฒ ๋๊ฒจ์ฃผ๊ณ , ๊ทธ ์์ ์ด ์๋ฃ๋์์ ๋ ์ฝ๋ฐฑ์ ์คํํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ๋ฌ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์ค์ ๋ก ์์ ์ ์คํํ๋ ๊ฒ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์๋ ๋ค๋ฅธ ์ฐ๋ ๋๋ค์ ๋๋ค.