Single Threaded Language์ธ Javascript์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด Event Loop์ ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค.
์์ํ๊ธฐ์ ์์ ๐โ
Javascript๋ ์น ๊ฐ๋ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋์ง๋ง, ์ฑ๊ธ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด Javascript๊ฐ Event Loop๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด ๋๋ค.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋? ๐คโ
์ค๋ช ํ๊ธฐ์ ์์ ์ฝ๋ ์คํ ๋ฐฉ์์ ๋ํ 2๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ธ ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
- ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ : ํ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ ์ ์์
- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ : ์ฌ๋ฌ ์์ ์ ๋์์ ์คํ
๋ฐ์ดํฐ fetching, ์ ์ input ์ฒ๋ฆฌ, DOM ์ ๋ฐ์ดํธ์ ๊ฐ์ ์์ ์ ์๋ก ๋ค๋ฅธ ์๊ฐ์ด ์์๋ ์ ์๋ ์น์ ๊ฐ๋ฐํ๋๋ฐ ์ ์ฉํฉ๋๋ค. Javascript๋ ์์ ์คํ๊ณผ ์ฝ๋ฐฑ์ ๊ด๋ฆฌํ๋ Event Loop๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํฉ๋๋ค.
Event Loop ์์ธํ ์ดํดํ๊ธฐ ๐โ
Event Loop๋ Javascript ๋ฐํ์ ํ๊ฒฝ์ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. Event Loop๋ ์ฝ๋ ์คํ, ์ด๋ฒคํธ ์ฒ๋ฆฌ, ์ฝ๋ฐฑ์ non-blocking ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
Event Loop์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค:
Call Stack: Javascript ์์ง์ ํจ์ ํธ์ถ์ ์ ์ ์ ์ถ(LIFO) ์์๋ก ์ฌ๊ธฐ์ ์ ์ฅํฉ๋๋ค. ํจ์๋ ํธ์ถ๋ ๋ ์คํ์ ์ถ๊ฐ๋๊ณ ์๋ฃ๋๋ฉด ์ ๊ฑฐ๋ฉ๋๋ค.
Callback Queue: "์์ Queue" ๋๋ "๋ฉ์์ง Queue"๋ผ๊ณ ๋ ํ๋ฉฐ, ์๋ฃ๋ ๋น๋๊ธฐ ์์ ์ฝ๋ฐฑ์ด ์ ์ฅ๋๋ ๊ณณ์ ๋๋ค. ์ฝ๋ฐฑ์ ์ถ๊ฐ๋ ์์๋๋ก ์คํ๋ฉ๋๋ค.
Web API:
setTimeout
,fetch
,addEventListener
์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๊ณต API๋ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. Javascript ์์ง๊ณผ๋ ๋ณ๊ฐ์ด์ง๋ง Event Loop์ ๊ธด๋ฐํ๊ฒ ์๋ํฉ๋๋ค.Microtask Queue: ์ด Queue๋ ํ๋ก๋ฏธ์ค ๋ฐ
MutationObserver
์ฝ๋ฐฑ ๊ฐ์ "Microtask"๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. Microtask Queue๋ Callback Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ผ๋ฉฐ, Call Stack์ ๊ฐ ์์ ์ดํ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
Event Loop๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค:
- Javascript ์์ง์ด Call Stack์์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
- ๋น๋๊ธฐ ์์ ์ ๊ฐ Web API๋ก off-load ๋ฉ๋๋ค.
- ์๋ฃ๋ ๋น๋๊ธฐ ์์ ์ฝ๋ฐฑ์ด Callback Queue์ ์ถ๊ฐ๋ฉ๋๋ค.
- Event Loop๋ Call Stack์ด ๋น์์ง ํ Microtask Queue๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- Event Loop๋ Callback Queue๋ฅผ ์ฒ๋ฆฌํ์ฌ ๊ฐ ์ฝ๋ฐฑ์ ์์๋๋ก ์คํํฉ๋๋ค.
1. Call Stack 2. Web APIs
---------- --------
| | ---Async---> | |
---------- --------
| | | |
---------- --------
| |
| |
v v
3. Microtask Queue 4. Callback Queue
--------------- -------------
| | <---- | |
--------------- -------------
| | | |
--------------- -------------
์ด ํ๋ก์ธ์ค๋ฅผ ํตํด Javascript ์์ง์ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์์ ์ ๊ณ์ ์คํํ ์ ์์ต๋๋ค.
Node.js์ ๋ธ๋ผ์ฐ์ ์ Event Loop ๐โ
Node.js์ ๋ธ๋ผ์ฐ์ ๋ชจ๋ Event Loop๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฝ๋ ์คํ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค:
Web API์ Timer: ๋ธ๋ผ์ฐ์ ๋ ์น API ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, Node.js๋ ์์ฒด API์ ํ์ด๋จธ(
setImmediate
,process.nextTick
๋ฑ)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ๊ฐ ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ API์ ๋๋ค.Concurrency ๋ชจ๋ธ: ๋ธ๋ผ์ฐ์ ๋ ์น ์์ปค API๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋์ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋์์ ์คํํฉ๋๋ค. ๋ฐ๋ฉด Node.js๋ ๋น์ทํ ๋์์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์์ปค ์ค๋ ๋ ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
Event-Driven ์ํคํ ์ฒ: Node.js์ ๋ธ๋ผ์ฐ์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ ์์ ํ๋ ์ด๋ฒคํธ ์ฃผ๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฒคํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ ์ํธ์์ฉ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ, Node.js์์๋ I/O ์์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
Event Loop ๊ตฌํ: ๋ธ๋ผ์ฐ์ ๋ HTML5 ์ฌ์์ ์ฌ์ฉํ๋ฉฐ, Node.js๋ libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์์ฒด ํฌ๋ก์ค ํ๋ซํผ Event Loop ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ฐจ์ด์ ์๋ ๋ถ๊ตฌํ๊ณ Event Loop์ ์ ๋ฐ์ ์ธ ๋์ ๋ฐ ๊ธฐ๋ฅ์ ๋ ํ๊ฒฝ์์ ํฌ๊ฒ ๋์ผํฉ๋๋ค.
๋ธ๋ผ์ฐ์ | Node.js | |
---|---|---|
Web API์ Timer | Web API | ์์ฒด API์ ํ์ด๋จธ |
Concurrency ๋ชจ๋ธ | Web Workers API | Worker Threads module |
Event-Driven ์ํคํ ์ฒ | User Interface | I/O operations |
Event Loop ๊ตฌํ | HTML5 specification | Built on the libuv library |
๊ฒฐ๋ก ๐โ
Event Loop๋ Javascript ์ธ์ด ๋ฐํ์ ํ๊ฒฝ์ ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ Javascript ๊ฐ๋ฐ์์๊ฒ Event Loop๋ฅผ ์ดํดํ๋ ๊ฒ์ ํ์์ ์ ๋๋ค. Event Loop์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์คํฐํ๋ฉด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.