Javascript Call Stack, Callback Queue, Event Loop
์ด๋ฒ์ 30์ด ๋ง๋ค API๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด์ setInterval ํจ์๋ฅผ ์ฌ์ฉํ์๋ค.
์ฌ์ฉ๋ฒ์ ์๊ณ ์์๋๋ฐ setInterval์ด ์ด๋ค ๊ฑด์ง ์ฐพ์๋ณด๋ค๊ฐ ๋น๋๊ธฐ์ ๊ด๋ จ๋ ๊ฐ๋ ๋ค์ด ๋์์ ์ ๋ฆฌ๋ฅผ ํ๊ฒ ๋์๋ค.
๋ฐ๋ผ์ ์ค๋์ ๋น๋๊ธฐ ๊ฐ๋ ์ ๋ฑ์ฅํ๋ Call Stack, Callback Queue, Event Loop์ ๋ํด ์์๋ณด์๋ค.
๋ณธ๋ก ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์์ HTML ๋ด๋ถ Javascript๋ก ์์ฑ๋ ์ฝ๋๊ฐ ์คํ๋๋ ๊ณผ์ ์ ๋ํด ์ ์ ์ ๋ฆฌํด๋ณด์.
๐ Javascript ์คํ์๋ฆฌ
์น ๋ธ๋ผ์ฐ์ ๋ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋๋ค.
- ์ฌ์ฉ์ ์ธํฐํ์ด์ค: ๊ฒ์์ฐฝ, ๋ค๋ก๊ฐ๊ธฐ/์์ผ๋ก๊ฐ๊ธฐ ๋ฒํผ, ์๋ก๊ณ ์นจ ๋ฑ ๋ธ๋ผ์ฐ์ ํ๋ก๊ทธ๋จ ์์ฒด GUI
- ๋ธ๋ผ์ฐ์ ์์ง: ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ ๋๋ง ์์ง ์ฌ์ด์ ๋์ ์ ์ด
- ๋ ๋๋ง ์์ง: ์์ฒญํ ์ฝํ ์ธ (HTML, CSS ๋ฑ) ํ์ฑ(parsing)ํ์ฌ ํ์
- ํต์ : HTTP ์์ฒญ๊ณผ ๊ฐ์ ๋คํธ์ํฌ ํธ์ถ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํด์ ๋ฐ ์คํ
- UI ๋ฐฑ์๋: ๊ธฐ๋ณธ์ ์ ์์ ฏ์ ๊ทธ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ก ํ๋ซํผ์์ ๋ช ์ํ์ง ์์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค
- ์๋ฃ์ ์ฅ์: ๋ก์ปฌ ์คํ ๋ฆฌ์ง, ์ฟ ํค ๋ฑ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ ์ฅํ๋ ์์ญ
์์ ๊ตฌ์ฑ์์ JS ์์ง์ด HTML ๋ด <script>๋ก ๊ฐ์ผ Javascript ์ฝ๋๋ฅผ ์คํํ๋ ์์ญ์ด๋ค.
๋ ๋๋ง ์์ง์ด HTML ๋ฌธ์๋ฅผ ํ ์ค์ฉ ์์ฐจ์ ์ผ๋ก ํ์ฑํ๋ค๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํ๋ script ํ๊ทธ๋ฅผ ๋ง๋๋ฉด DOM ์์ฑ์ ์ผ์ ์ค๋จํ๋ค. script ํ๊ทธ์ src์ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์๋ฒ์ ์์ฒญํ์ฌ ์๋ต๋ฐ์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ์ฑํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์๊ฒ ์ ์ด๊ถ์ ๋๊ธด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์ฝ๊ณ ์คํํ๋ ์๋ฆฌ๋ ์๋์ ๊ฐ๋ค.
๐ Javascript ์์ง
Javascript ์์ง์ ๋ธ๋ผ์ฐ์ ๋ด์ ๋ด์ฅ๋์ด ์์ผ๋ฉฐ ๊ทธ๊ฒ Memory Heap๊ณผ Call Stack ๋ ๊ฐ์ง ์์ญ์ผ๋ก ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ๋ค.
Memory Heap
๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ฅํ๋ ๊ณณ์ผ๋ก ํจ์๋ ๋ณ์, ํจ์๋ฅผ ์คํํ ๋ ์ฌ์ฉํ๋ ๊ฐ๋ค์ ์ ์ฅํ๋ค.
ํด๋น ๋ถ๋ถ์์ ๋์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ณ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น์์ฃผ๋ GC๊ฐ ์๋ค.
Call Stack
์ฝ๋๊ฐ ์คํ๋๋ฉด ์์๋ฅผ ๊ธฐ์ตํด ๋๊ณ , ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ๊บผ๋ด์ ์คํํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ณต๊ฐ
Stack ์๋ฃ ๊ตฌ์กฐํํ๋ก LIFO ์์น์ ๋ฐ๋ฅธ๋ค.
Call Stack์ ๋ค์ด๊ฐ ํจ์ ํํ๋ ์๋ .js ์ฝ๋๋ฅผ ์คํํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค.
function add(a, b) {
return a + b;
}
function average(a, b) {
return add(a, b) / 2;
}
console.log(average(10, 20));
- ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด Call Stack์๋ console.log → average → add ์์ผ๋ก ์์ด๋ฉฐ, ์ค์ ์คํ์์๋ add → average → console.log ์์ผ๋ก ์คํ๋๋ค.
- ์ค์ ๋ก ์ฝ๋๋ฅผ ์คํํ์ ๋, ๋ค์์ ์คํ๋์ด์ผ ํ ์ฝ๋๋ฅผ ์์๋๋ก ๊ธฐ๋ก์ ํ๋ฉฐ, ์์ฐจ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ๋๋ค.
- ์ด Call Stack์ ์ ์ฅ๊ณต๊ฐ์ด ๊ฐ๋ ์ฐจ์ ๋์น๋ ํ์์ stack over flow ๋ผ๊ณ ํ๋ค.
๐ Call Stack, Callback Queue, Event Loop
Javascript๋ ์ฑ๊ธ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์ call stack์ 10์ด ๊ฑธ๋ฆฌ๋ ์์ ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ๋ชจ๋ ์์ ์ 10์ด + a๋ก ๋๋ ค์ง๋ค. ๊ทธ๋์ ํ์ํ๊ฒ Event Loop์ Callback Queue, Browser Web API์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ธ์ด๋ก ํ ์๊ฐ ํ๋์ ์์ ๋ง์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋จ์ผ ์ค๋ ๋์์๋ ๋์์ ๋ง์ ์์
์ ์ํํ ์ ์๋ค.
- ๋น๋๊ธฐ ๋์์ ํต์ฌ ์์๋ ์ธ์ด๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ค!
Web API
- Web API๋ ์น ํ์ด์ง์ ์ ๊ทผํ๊ณ ์กฐ์ํ๋ DOM(Document Object Model)๊ณผ BOM(Browser Object Model)์ ํฌํจํ๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
- Web API๋ Dom ์ด๋ฒคํธ, Ajax, setTimeout ๋ฑ ๋น๋๊ธฐ ์์ ๋ค์ ์ํํ ์ ์๋๋ก API๋ฅผ ์ง์ํ๋ค.
Event Loop
- ์ด๋ฒคํธ ๋ฐ์ ์ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์๋ค์ ๊ด๋ฆฌํ์ฌ Callback Queue์ ์ ๋ฌํ๊ณ , Callback Queue์ ๋ด๊ฒจ์๋ ์ฝ๋ฐฑ ํจ์๋ค์ Call Stack์ ๋๊ฒจ์ค๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๊ฐ Callback Queue์์ Call Stack์ผ๋ก ์ฝ๋ฐฑํจ์๋ฅผ ๋๊ฒจ์ฃผ๋ ์์ ์ Call Stack์ ์์ฌ์๋ ํจ์๊ฐ ์์๋๋ง ์ํ๋๋ค. ๋ฐ๋ณต์ ์ผ๋ก Call Stack์ด ๋น์ด์๋์ง ํ์ธ ํ๋ ๊ฒ์ tick์ด๋ผ๊ณ ํ๋ค.
Callback Queue
- Web API์์ ๋น๋๊ธฐ ์์ ๋ค์ด ์คํ๋ ํ ํธ์ถ๋๋ ์ฝ๋ฐฑํจ์๋ค์ด ๊ธฐ๋ค๋ฆฌ๋ ๊ณต๊ฐ์ด๋ค.
- Event Loop๊ฐ ์ ํด์ค ์์๋๋ก ์ค์ ์ ์์ผ๋ฉฐ, FIFO ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.
๐ SetTimeout ๋์ ์์
๋ํ์ ์ธ WebAPI ํธ์ถ ํจ์์ธ setTimeout ํจ์์ ๋์ ์์์ด๋ค.
console.log('first');
setTimeout(function cb(){
console.log('second');
}, 1000);
console.log('third');
- console.log(’first’)๊ฐ Call Stack์ ์ถ๊ฐ(push)๋๋ค.
- console.log(’first’)๊ฐ ์คํ๋์ด ํ๋ฉด์ ์ถ๋ ฅ๋ ํ, Call Stack์์ ์ ๊ฑฐ(pop) ๋๋ค.
- setTimeout(function cb…)์ด Call Stack์ ์ถ๊ฐ๋๋ค.
- setTimeout ํจ์๊ฐ ์คํ๋๋ฉด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ timer Web API๋ฅผ ํธ์ถํ๋ค. ๊ทธ ํ Call Stack์์ ์ ๊ฑฐ๋๋ค.
- console.log(’third’)๊ฐ Call Stack์ ์ถ๊ฐ๋๋ค.
- console.log(’third’)๊ฐ ์คํ๋์ด ํ๋ฉด์ ์ถ๋ ฅ๋๊ณ Call Stack์์ ์ ๊ฑฐ๋๋ค.
- setTimeout ํจ์์ ์ ๋ฌํ 1000ms ์๊ฐ์ด ์ง๋ ๋ค Callback์ผ๋ก ์ ๋ฌํ cb ํจ์๊ฐ Callback Queue์ ์ถ๊ฐ๋๋ค.
- Event Loop๋ Call Stack์ด ๋น์ด์๋ ๊ฒ์ ํ์ธํ๊ณ Callback Queue๋ฅผ ์ดํด ๋ณธ๋ค. cb๋ฅผ ๋ฐ๊ฒฌํ Event Loop๋ Call stack์cb ์ถ๊ฐ
- cb ํจ์๊ฐ ์คํ๋๊ณ ๋ด๋ถ์ console.log(’second’)๊ฐ Call Stack์ ์ถ๊ฐ๋๋ค.
- console.log(’second’)๊ฐ ํ๋ฉด์ ์ถ๋ ฅ๋๊ณ Call Stack์์ ์ ๊ฑฐ๋๋ค.
- cb๊ฐ Call Stack์์ ์ ๊ฑฐ๋๋ค.
์์ ๊ด๋ จํ ์์ธํ ๊ธ์ ์๋ ๊ธ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
https://medium.com/sjk5766/javascript-๋น๋๊ธฐ-ํต์ฌ-event-loop-์ ๋ฆฌ-422eb29231a8
setTimeout vs setInterval
setTimeout: ์ง์ ๋ ์๊ฐ์ด ๊ฒฝ๊ณผํ ํ์ ํ ๋ฒ๋ง ํน์ ํจ์๋ฅผ ์คํํ๋ ๊ธฐ๋ฅ ์ ๊ณต setInterval: ์ผ์ ํ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ง์ ๋ ํจ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์คํํ๋ ๊ธฐ๋ฅ ์ ๊ณต clearInterval: setInterval() ํจ์๊ฐ ์คํ๋๊ณ ์์ ๋, clearInterval() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต ์ค์ง(๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง)
์ฐธ๊ณ ์๋ฃ
https://velog.io/@qlgks1/javascript-node-๋์-์๋ฆฌ
https://velog.io/@somda/FE-JavaScript-๋์-๊ณผ์ -Callback-Queue-Event-Loop
https://medium.com/sjk5766/javascript-๋น๋๊ธฐ-ํต์ฌ-event-loop-์ ๋ฆฌ-422eb29231a8