# * Event Loop
์๋ฐ์คํฌ๋ฆฝํธ๋ "๋จ์ผ ์ค๋ ๋" ๊ธฐ๋ฐ์ ์ธ์ด์ด๋ค.
๋์์ ํ๋์ ์์
๋ง๋ค ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ง์ธ๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉ๋๋ ํ๊ฒฝ์์๋ ๋ง์ ์์
์ด ๋์์ ์ฒ๋ฆฌ๋๋ค.
์๋ฅผ๋ค์ด ๋ง์ฐ์ค ์
๋ ฅ ๋ฐ ํค๋ณด๋ ์
๋ ฅ์ ๋ฐ๋ ์ผ๋ค์ ๋์์ ์ฒ๋ฆฌํ๊ฑฐ๋, ๋ค์์ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ๋ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ "์ด๋ฒคํธ ๋ฃจํ"์ ๊ธฐ๋ฐํ ๋์์ฑ(concurrency) ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๋ค.
์ฆ "์ด๋ฒคํธ ๋ฃจํ" ๋ฅผ ํตํด ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์์ฑ์ ์ง์ํ๋ค.
# Javascript Engine
- Javascript Engine์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑํ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ์ธํฐํ๋ฆฌํฐ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ธ๊ฐ์ง ์์ญ์ผ๋ก ๋๋๋ค.
- Call stack
- Task Queue(Event Queue)
- Heap
# Stack
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๊ฐ ์คํ๋๋ ๋ฐฉ์์ "Run to Completion" ์ด๋ผ๊ณ ๋งํ๋ค.
ํ๋์ ํจ์๊ฐ ์คํ๋๋ฉด ์ด ํจ์์ ์คํ์ด ์ข
๋ฃ๋ ๋๊น์ง ์ด๋ค ์์
๋ ์ค๊ฐ์ ์คํ๋์ง ๋ชปํ๋ค.
ํ์ฌ ์คํ์ ์์ฌ์๋ ๋ชจ๋ ํจ์๋ค์ด ์คํ์ ๋ง์น๊ณ ์คํ์์ ์ ๊ฑฐ๋๋ฉด ๋ค์ ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ํธ์ถ ์คํ์ ๋ด์ ์ฒ๋ฆฌํ๋ค.
function baz(){
console.log('Hello from baz');
}
function bar() {
baz();
}
function foo() {
bar();
}
foo();
2
3
4
5
6
7
8
9
10
์ ์ฝ๋๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋ํ๋ค.
# Heap
๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ค์ ํ ์์ ํ ๋น๋ฉ๋๋ค. ํ์ ๊ตฌ์กฐํ๋์ง ์์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ง์นญํ๋ค.
# Queue
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ์์ ์ฒ๋ฆฌํด์ผํ๋ Task๋ค์ ์์๋ก ์ ์ฅํ๋๊ณณ์ด๋ค. ํ์คํฌํ๋ ์ฝ๋ฐฑ ํจ์๋ค์ด ๋๊ธฐํ๋ ํํํ์ ๋ฐฐ์ด์ด๊ณ , ์ด๋ฒคํธ๋ฃจํ๋ ํธ์ถ ์คํ์ด ๋น์์ง ๋๋ง๋ค ํ์คํธํ์์ ํจ์๋ค์ ๊บผ๋ด์ ๋ค์ ์คํ์ผ๋ก ๋ฃ์ด์ฃผ๊ณ ์คํํ๋ ์ญํ ์ ํด์ค๋ค.
# Event Loop
์์ ์ค๋ช ๊ณผ ๊ฐ์ด ์ด๋ฒคํธ๋ฃจํ๋ ์ฝ์คํ๊ณผ ์ฝ๋ฐฑํ๋ฅผ ๊ฐ์ํ๋ฉด์ ์ฝ์คํ์ด ๋น์ด์์๊ฒฝ์ฐ ์ฝ๋ฐฑํ์์ ์ฒซ๋ฒ์งธ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ ์ฝ์คํ์ ๋ฐ์ด๋ฃ๋ ์ญํ ์ ํ๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋น ์ด๋ฒคํธ๊ฐ ์คํ๋๋ค.
ํ๊ฐ์ง ๊ฐ์ ์ ํด๋ณด์๋ฉด ๋ง์ ์๊ฐ์ ์๋ชจํ๋ ํจ์๊ฐ stack์ push ๋๋ค๋ฉด, ์ฑ๊ธ์ค๋ ๋ ๊ธฐ๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํด๋น ํจ์๊ฐ ๋๋ ๋๊น์ง ์๋ฌด๋ฐ ์ถ๊ฐ ์์ ์ ํ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค. ์ฌ์ฉ์ ๊ด์ ์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋จนํต์ฒ๋ผ ๋ณด์ผ ์ ์๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋ Web API์ ์ ์๋์ด์๋ ํจ์๋ค์ ๋น๋๊ธฐ(์ฝ๋ฐฑ)๋ก ์คํ๋๋ค.
console.log('Start');
setTimeout(function() {
console.log('Time-out');
}, 5000);
console.log('End');
// Start
// End
// 5์ด๋ค Time-out
2
3
4
5
6
7
8
9
10
11
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด 'Start', 'End', 'Time-out' ์์ผ๋ก ์ถ๋ ฅ์ด ๋๋๊ฑธ ํ์ธ ํ ์ ์๋ค.
๋จผ์ ์คํ์ "console.log('Start')" push ๋๊ณ 'Start' ๋ฅผ ์ถ๋ ฅํ๊ณ ์คํ์ ๋๊ฐ๋ค.
๋ค์ setTimeout() ํจ์๊ฐ ์คํ์ push ๋์ง๋ง 5์ด๋ค์ ์๋ํ ํจ์๋ฅผ ์คํ์ ์์๋ ์ ์๋ค.
์คํ์ ์์๋์ง ์๊ณ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ๋๋ค.
๊ทธ๋ค์ ์คํ์ "console.log('End')" ๊ฐ push ๋๊ณ 'End' ๋ฅผ ์ถ๋ ฅํ๋ค
5์ด๋ค "console.log('Time-out')"์ด ์คํ์ push ๋๊ณ , ๋ง์ง๋ง์ผ๋ก 'Time-out'์ ์ถ๋ ฅํ๋ค.
setTimeout ์ฝ๋ฐฑํจ์๋ Web APIs๋ก ๋ณด๋ด์ง๊ณ ์คํ์์ pop ๋๋ค. Web APIs timer 5์ด๋ค ์์ ์ด ๋๋๋ฉด ํ์คํฌํ๋ก ์ฎ๊ฒจ์ง๋ค. ์ด๋ฒคํธ๋ฃจํ๋ ์ฝ์คํ์ด ๋น์ด์๋์ง ํ์ธํ๊ณ ํ์คํธํ์ ์ฒซ๋ฒ์งธ ํจ์๋ฅผ ์ฝ์คํ์ผ๋ก push ํด์ฃผ๊ณ ์ด๋ฒคํธ๊ฐ ์คํ๋๋ค. ๋จ, ์ฝ์คํ์ด ๋น์์๋ ์ํ๊ฐ ์๋๋ผ๋ฉด ํ์คํธํ์ ์๋ ์์ ์ ์ฝ์คํ์ผ๋ก push ํ์ง ์๋๋ค.์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๊ทธ๋ฆผ์์ Web APIs ์์ญ์ ํ์ธ ํ ์ ์๋ค.
# Reference
์ฐธ์กฐ