๐ฑ dreaming DiNO
[js] ์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๊ตฌ์กฐ ๋ณธ๋ฌธ
์ถ์ฒ: https://tristy.tistory.com/51
[JavaScript] JavaScript ํํค์น๊ธฐ - ๋์ ์๋ฆฌ
ํธ๋ฆฌ์คํฐ๊ฐ JavaScript๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋จ๊ธด ๊ธฐ๋ก์ ๋๋ค. ํ๋ฆฐ ๋ด์ฉ์ ์ธ์ ๋ ์ง ๋ง์ํด์ฃผ์ธ์ ~! ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด ์ธ์ด๊ฐ ๋๋์ฒด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ถ๊ธํ ๋๊ฐ ์์ต๋๋ค. ๋๋์ฒด๊ฐ
tristy.tistory.com
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด ์ธ์ด๊ฐ ๋๋์ฒด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ถ๊ธํ ๋๊ฐ ์์ต๋๋ค. ๋๋์ฒด๊ฐ ์ฑ๊ธ ์ค๋ ๋์ธ์ง ๋ฉํฐ ์ค๋ ๋์ธ์ง ํท๊ฐ๋ฆฌ๊ฒ ๋์ํ๋ ์ด์ํ ์ธ์ด์ ๋๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ ํ๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ๋ฅผ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๐ฃ ์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๊ตฌ์กฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์ ์ ๋จผ์ ์ ์ฒด์ ์ธ ๋์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ง์ V8, Rhino, SpiderMonkey ๋ฑ ๋ค์ํ๊ฒ ์์ง๋ง ์ด ์ค์์๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์๋ Google์์ ๋ง๋ V8 ์์ง์ผ ๊ฒ์ ๋๋ค. ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๊ฒ ํด ์ฃผ๋ V8 ์์ง์ ๊ฐ๋ตํ๊ฒ ํํํ ๊ทธ๋ฆผ์ ๋๋ค.

์ถ์ฒ: https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
์์ง์ ๋ณด์๋ค์ํผ ๋ ๊ฐ์ง ๊ตฌ์ฑ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ๋๋ Memory Heap์ด๊ณ , ๋ค๋ฅธ ํ๋๋ Call Stack์ด์ฃ . Memory Heap(๋ฉ๋ชจ๋ฆฌ ํ)์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๋ฐ์ํ๊ณ , Call Stack(ํธ์ถ ์คํ)์ ์ฝ๋ ์คํ์ ๋ฐ๋ผ ์คํ์ด ํ๋์ฉ ์์ด๋ ๊ณณ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด setTimeOut() ๊ฐ์ ์๋ง์ API๋ฅผ ์ฌ์ฉํ๊ณ ๋ ํฉ๋๋ค. ์ด๋ฐ API๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ ๊ณตํด์ฃผ๋ ์์์ผ๊น์? ์ด๋ฌํ API๋ค์ Web API๋ผ๊ณ ํด์ ์น ๋ธ๋ผ์ฐ์ ํน์ node js ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์์ ์ง์ํด์ฃผ๋ API์ ๋๋ค. ๊ทธ๋์ ์ด๋ค ๋ธ๋ผ์ฐ์ ์์๋ ์ง์์ ํด์ค ์๋ ์๊ณ , ์ ํด ์ค ์๋ ์๋ ๊ฒ์ด์ฃ .

์ถ์ฒ: https://developer.mozilla.org/ko/docs/Web/API
๊ทธ๋ฐ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๊น ์์์ ๋์จ setTimeOut()๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํจ์๋ ๋ถ๊ตฌํ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด์๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ์ ๊ฐ๊ณ ์์ง ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ป๊ฒ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ์ ์์๋๊ณ ์? ๋ฐ๋ก Event loop & Callback Queue์ ํ์์ ์ฝ๋ผ๋ณด๋ ์ด์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์์์ ์ค๋ช ํ Web API์ ๋๋ถ์ด ์น ๋ธ๋ผ์ฐ์ ๋ ๋ฐํ์์์๋ Event loop์ Callback Queue๋ผ๋ ๊ฒ๋ ์ง์ํด์ค๋๋ค.
์ฆ, ๋ฐ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋์ ๊ตฌ์กฐ๊ฐ ํ์ํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. (์ง์!)

์ถ์ฒ:https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
๐ค ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌด์จ ์ค๋ ๋์์ ๊ทธ๋ผ?
๊ทธ๋ ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฉํฐ ์ค๋ ๋์ผ๊น์ ๋จ์ผ ์ค๋ ๋์ผ๊น์? ์ ๋๋ก ์์๋ณด๊ธฐ ์ํด ์ข ๋ ํ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๊น ์์์ V8 ์์ง์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ดค์ ๋ ํ๋์ Call Stack(ํธ์ถ ์คํ)๊ณผ ํ๋์ Memory Heap(๋ฉ๋ชจ๋ฆฌ ํ)์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. Call Stack์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ ์ค์ฉ ์ฝ์ด๊ฐ๋ฉฐ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ์์๋๋ก ๋ ์ ์๋๋ก ๋ณด์ฅํด์ฃผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์คํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ ์ ์ถ(LIFO, Last-In-First-Out)์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
Call Stack์ ์์ด๋ ํ๋์ ์ฌ๊ฐํ์ ์คํ ํ๋ ์(Stack Frame)์ด๋ผ๊ณ ํ๋๋ฐ, ๋ง์ฝ ํจ์๊ฐ ์คํ์ด ๋๋ค๋ฉด์ ์คํ์ ๋งจ ์์ ์๋ ์คํ ํ๋ ์์ ๊ฐ๋ฆฌํค๋ ์ค์ด๋ฉฐ, ํจ์์ ์คํ์ด ๋๋ ๋ ํด๋น ์คํ ํ๋ ์์ Call Stack์์ ์ ๊ฑฐํ๊ฒ ๋ฉ๋๋ค. ๋ง๋ก๋ง ํ๋ฉด ์ดํด๊ฐ ์ ๋๋๊น ๋ํ์ ์ธ ์๋ฅผ ๊ฐ์ง๊ณ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด๊ฒ ์ต๋๋ค. ๋ค์์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ๋ ์์ ์ ๋๋ค.
function multiply(x, y) {
return x * y;
}
function printSquare(x) {
var s = multiply(x, x);
console.log(s);
}
printSquare(5);
๋งจ ์ฒ์ ์์ง์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋๋ ์๋ฌด ํจ์๋ ๋ง๋์ง ์์ ์ํ๋ผ์ ๋น์ด์๊ฒ ์ง๋ง, ์ฝ๋๋ฅผ ์คํํ๋ฉฐ ๊ฐ์ฅ ๋จผ์ printSquare๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ printSquare๋ฅผ Push ํด์ ์คํ์ ์๊ณ ์ฝ์ด๊ฐ๋ค ๊ทธ๋ค์์ ๋ง๋ multiply๋ฅผ Push ํด์ ์คํ์ ์์ต๋๋ค. ๋ ์ด์ ์์ ํจ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ๋งจ ์์ ์คํ ํ๋ ์๋ถํฐ ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค.

์ถ์ฒ: https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
๋ง์ฝ ์คํ์ ์ด๊ณผํ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ ์ฝ๋๋ฅผ ๋๋ฆฌ๋ฉด Maximum call stack size ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.

๋ฌดํ ๋ฃจํ๊ฐ ๋ ๋๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ฐ์ ๊ทธ๋ฆผ์ฒ๋ผ ํํํ ์ ์์ต๋๋ค. Call Stack์ ์ ํด์ง ์คํ ์ฌ์ด์ฆ๊ฐ ์กด์ฌํ๊ณ , ํ๋์ฉ ์์ด๊ธฐ ๋๋ฌธ์ ์ ํด์ง ์ฉ๋์ ์ด๊ณผํ๊ฒ ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ํํ๋ค ์ด๊ฒ์ Stack Overflow๋ผ๊ณ ๋งํฉ๋๋ค.

์ถ์ฒ: https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
์ด์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋์ Call Stack์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ํ๋์ ๋ช ๋ น์ด๋ง ์คํ๋ ์๋ฐ์ ์์ต๋๋ค. ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ํ ์ ์๊ณ ํ๋์ฉ๋ง ์ฒ๋ฆฌํ ์ ์์ด์! ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋์ด๋ฉฐ ๋๊ธฐ์ ์ธ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ๋ฌดํ ๋ฃจํ๋ ๋ฐ์ํ ์ ์์ด๋ ๋๊ธฐํ ๋ฌธ์ ์ธ ๊ต์ฐฉ์ํ(DeadLock)๋ ๋ฐ์ํ ์ ์์ต๋๋ค. (์ผ์ธ!)
๐ค ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋น๋๊ธฐ ์์ ์ ์ํํ๋์?
๊ทธ๋ฐ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋์ ์ฌ์ฉ๋์ฃ ? ์น์์๋ ์ฌ์ฉํ๊ณ node js๋ deno js ๊ฐ์ ๊ฐ์ข ๋ฐํ์์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ๊ฐ์ง ์์ ์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋ + ๋๊ธฐ์ ํน์ฑ์ ๊ฐ์ง Call Stack๋ง์ ์ฌ์ฉํด์ ์น ํ์ด์ง๋ฅผ ๋ง๋ค์๋ค๋ฉด ์ง๊ธ์ฒ๋ผ ๋ค์ด๋ฒ์ฒ๋ผ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ์ดํธ๊ฐ ๋์ฌ ์ ์์์ ๊ฒ์ ๋๋ค. ํ๋์ Call Stack์์ ์ ๋ถ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ฉด, ์ด๋ค ์์ ์ ๊ฒฝ์ฐ์๋ ์ฒ๋ฆฌํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ด์ ์น ํ์ด์ง๊ฐ ๋ฉ์ถ๊ฑฐ๋ ์ ๋๋ก ๋์ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ ์ฌ์ฉ์๋ค์ ์นํ์ด์ง๊ฐ 2์ด๋ง ๋ฆ์ด๋ ๋๋ฆฌ๋ค๊ณ ์๊ฐํ๋ค๊ณ ์. ๊ทธ๋ผ ์๋ผ์์์?

์ถ์ฒ: https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
์ด๋ด ๋ ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์๊ฒ ๋ ๊ฐ ๊ฐ์ ์กด์ฌ์ธ Event loop & Callback Queue๊ฐ ํ์ํฉ๋๋ค! ํ๋ฒ ์ฝ๋์ ๊ทธ๋ฆผ์ ํตํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฐ์ ์ฝ๋๋ ๊ณผ์ฐ ์ด๋ค ์์๋๋ก ์คํ๋ ๊น์? ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋์ Call Stack๋ง ์ฌ์ฉํ๋๊น ์ฝ์์๋ 1, 3, 2๋ก ์ถ๋ ฅ๋์ง ์์๊น์?
function foo() {
console.log("1");
}
function foo2() {
console.log("2");
}
foo();
setTimeout(function () {
console.log("3");
}, 2000);
foo2();
ํ๋ ธ์ต๋๋ค! ์ ๋ต์ 1, 2, 3์ด์์ต๋๋ค. ๋ถ๋ช ํ ํ๋์ Call Stack์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์๋๋ก ์คํ์ ๋ค์ด๊ฐ๋ฉด 1, 3, 2๊ฐ ๋ง์ ํ ๋ฐ ์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ ๊ฒ์ผ๊น์? ์ด ๋ถ๋ถ์ ์๊ธฐ ์ํด์๋ Event loop & Callback Queue์ ๋์ ๋ฐฉ์์ ์ดํดํด์ผ ํฉ๋๋ค. ์ง๊ธ๋ถํฐ ํ๋ฒ ์์ ์ฝ๋๋ฅผ ํ ๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฒด์ ์ธ ๋์ ๋ฐฉ์์ ํ๋ฒ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

์์ฝ๋ค์. 1, 2, 3์ด์์ต๋๋ค!
1. ์ ์ผ ๋จผ์ foo()๋ผ๋ ํจ์๊ฐ Call Stack์ ์์ด๊ฒ ๋ฉ๋๋ค.

2. ๊ทธ๋ค์ foo() ํจ์ ์์ ์๋ console.log()๊ฐ Call Stack์ ์์ด๊ฒ ๋ฉ๋๋ค.

3. ์ฝ์ ์ฐฝ์ 1์ ์ถ๋ ฅํฉ๋๋ค.

3. foo() ํจ์๋ ์ข ๋ฃ๋์์ผ๋ Call Stack์์ ๋น ์ง๊ฒ ๋๊ณ , setTimeOut()์ด Call Stack์ผ๋ก ๋ค์ด์ต๋๋ค.

4. setTimeOut()์ ๋ณด๋๊น ๋น๋๊ธฐ ํจ์๋ค์. ๊ทธ๋ ๋ค๋ฉด ์ด๊ฑธ Web API์์ ์ฒ๋ฆฌํ๋๋ก ๋ณด๋ ๋๋ค. ๋ง์ฝ node js๋ deno js ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌํ๋๋ก ๋ณด๋ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ํจ์์ธ foo2() ํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.

5. foo2() ํจ์ ์์ ์๋ console.log()๊ฐ Call Stack์ ์์ด๊ฒ ๋ฉ๋๋ค.

6. ์ฝ์ ์ฐฝ์ 2๋ฅผ ์ถ๋ ฅํฉ๋๋ค.

7. foo() ํจ์๋ ์ข ๋ฃ๋์์ผ๋ Call Stack์์ ๋น ์ง๊ฒ ๋ฉ๋๋ค. ์ด์ ๋ค์ด์ฌ ํจ์๊ฐ ์๋ค์. ๊ทธ๋ฐ๋ฐ ์์ง ๋น๋๊ธฐ ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์์ฃ ? setTimeOut()์ ์๊ฐ์ 2์ด๋ก ์ค์ ํด ๋์์ผ๋ 2์ด๊ฐ์ Wab API์์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. 2์ด๊ฐ ์ง๋ ํ์๋ setTimeOut()์ ์ฝ๋ฐฑ ํจ์๋ฅผ Callback Queue๋ก ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ์๋ฉด ์ ๋๋ ๊ฒ Call Stack์ ์๋ foo2() ํจ์๊ฐ ์ข ๋ฃ๋๊ณ ๋์์ผ Web API๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ ์๋๊ณ setTimeOut()์ด Web API๋ก ๋์ด๊ฐ ์์ ๋ถํฐ ์ฒ๋ฆฌ๋๊ณ ์๋ ๊ฒ์ ๋๋ค. ์ฆ, Call Stack์์๋ foo2() ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์๊ณ , Web API์์๋ setTimeOut()์ 2์ด ๋์ ๋๋ฆฌ๊ณ ์์๋ค๋ ๊ฒ์ด์ฃ .

8. ์ด์ Event Loop๊ฐ ๋ฑ์ฅํฉ๋๋ค! Event Loop๋ Callback Queue์ ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ Call Stack์ผ๋ก ๋ณด๋ด์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Call Stack์ด ๋น์ด์๋์ง๋ฅผ ๊ฒ์ฌํฉ๋๋ค. ๋ง์ฝ Call Stack์ด ๋น์ด ์๋ค๋ฉด Callback Queue์ ์๋ ํจ์๋ฅผ Call Stack์ผ๋ก ๋ณด๋ด์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.

9. Call Stack์ ์๋ console.log()๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋ ๊ฒ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.

๐ค ์ Call Stack์ด ๋น์ด์์ด์ผ ํ๋ ๊ฒ์ธ๊ฐ์?
์ฌ๊ธฐ์ ๋๋ ๊ถ๊ธ์ฆ! ๊ทธ๋ ๋ค๋ฉด ์ Event Loop๋ Call Stack์ด ๋น์ด์ ธ์๋์ง ํ์ธํ๊ณ Callback Queue์ ํจ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๊น์? Call Stack์ด ๋น์ด์ ธ ์๋ ๋ง๋ ์๊ด์์ด ๊ทธ๋ฅ ๋ฃ์ด๋ฒ๋ฆฌ๋ฉด ํจ์ฌ ๋ ํ๋ก๊ทธ๋จ์ด ๋นจ๋ผ์ง๊ณ ์ข์ ํ ๋ฐ ๋ง์ด์ฃ . ์ ๋ ์ด๋ฐ ๊ถ๊ธ์ฆ์ด ์์ด์ Stack Overflow ์ฌ์ดํธ๋ฅผ ๋ค์ ธ๋ณด๊ฒ ๋์๊ณ , ๋ง์นจ V8 ์์ง์ ๊ฐ๋ฐํ์ จ๋ ๋ถ์ด ๋ต๋ณ์ ์จ์ฃผ์ ๊ธ์ ์ฐพ์ ์ ์์์ต๋๋ค.

์ถ์ฒ: https://stackoverflow.com/questions/52906975/call-stack-event-loop-why-waiting-for-empty-stack
์๋ฅผ ๋ค์ด Call Stack์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ณ ์๋ ํจ์๋ค์ด ์๋ค๊ณ ๊ฐ์ ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ํจ์๋ฅผ ์ ์ฒ๋ฆฌํ๊ณ ์๋ ์์ค์ ๊ฐ์๊ธฐ Event Loop์์ Callback Queue์ ๋ด์ฉ์ Call Stack์ผ๋ก Push ํด์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋์ ์ด์ฉ ์ ์์ด ์ ์ฒ๋ฆฌํ๊ณ ์๋ ํจ์๋ฅผ ์ค๋จํ๊ณ Event Loop๊ฐ ๋ณด๋ธ ํจ์๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ ๊ฐ์๊ธฐ Event Loop์์ Callback Queue์ ๋ด์ฉ์ Call Stack์ผ๋ก Push ํด์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ํฉ๋๋ค. ๊ณผ์ฐ ์ด ๊ฒฝ์ฐ ์คํ์ ๊ฒฐ๊ด๊ฐ์ ์ด๋ป๊ฒ ๋ ๊น์? ๊ณผ์ฐ ๋ด๊ฐ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ ํจ์๋ ๋ด๊ฐ ์์ํ๋ ์๊ฐ์ ๋๋๊ณ ๊ฐ์ ์ ๋๋ก ๋์ถํ ์ ์์๊น์?
๊ฐ๋จํ ๋งํ์๋ฉด ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ฐ๋์ Call Stack์ด ๋น์ด์ ธ์๋ ์ํ์์๋ง Call Stack์ผ๋ก Push ํ๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ ์ธ์ด๊ฐ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์๋ ๊ฒ์ ํผํ๊ณ ๋จ์ผ ์ค๋ ๋ ์ธ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฅํด์ฃผ๊ธฐ ์ํจ์ ๋๋ค. ๋ง์ฝ ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์์ ์์์ ์๋ฅผ ๋ค์๋ ๊ฒ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด, ๊ทธ๊ฒ์ ๋ฉํฐ ์ค๋ ๋์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ํฉ์ ๊ทธ๋๋ก ๋จ์ผ ์ค๋ ๋ ์ธ์ด๊ฐ ์๊ฒ ๋์ด๋ฒ๋ฆฝ๋๋ค. ๋ฐ๋ผ์ ๋จ์ผ ์ค๋ ๋ ์ธ์ด์์ "ํด๋น ํจ์๋ฅผ ์ค๋จํ์ง ๋ง๊ณ ์คํ์ด ๋๋ ๋ค์ Event Loop๊ฐ ๋ณด๋ด์ค ํจ์๋ฅผ ์ฒ๋ฆฌํด์ผ ํด!"๊ฐ์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์์๊ฐ ์ถ๊ฐ๋ก ํ์ํด์ง๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๊ฒฐ๊ตญ์๋ Event Loop๊ฐ Call Stack์ด ๋น์ด์๋์ง๋ฅผ ํ์ธํ๊ฒ ํจ์ผ๋ก์จ ํ๋ก๊ทธ๋๋จธ๋ ๋๊ธฐํ ๋ฌธ์ ์ ๋ํด ๊ณจ๋จธ๋ฆฌ๋ฅผ ์์ ํ์๊ฐ ์์ด์ง๋ ๊ฒ์ด๋๋๋ค.
๐ฃ ๊ฐ๋จ ์ ๋ฆฌ
๊ฒฐ๋ก ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋จ์ผ ์ค๋ ๋์ ๋๊ธฐ์ ์ธ์ด์ด์ง๋ง, ์น ๋ธ๋ผ์ฐ์ ๋ ๋ฐํ์๋ค์ ๋์์ ๋ฐ์์ ๋น๋๊ธฐ ์์ ๋ค์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์๊ณ , ๋ง์น ๋ฉํฐ ์ค๋ ๋์ธ ๊ฒ์ฒ๋ผ ๋์ํ ์ ์๋ ์งฑ์งฑ ์ ๊ธฐํ ์ธ์ด ๋ผ๋ ๊ฒ์ ๋๋ค. ๋์์๋ฆฌ๋ ์ข ํท๊ฐ๋ ธ์๋๋ฐ ์ ๋ ์๋ฒ์ ์ ๋ฆฌํ๋ฉด์ ๋ค์ ํ๋์ฉ ์์๊ฐ ์ ์์๊ณ , ๊ถ๊ธํ๋ ๊ฒ๋ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ์ญ์ ์ฌ๋์ ์ ๋ฆฌ๋ฅผ ํด์ผ ๊ธฐ์ต์ ๋จ๋๋ด์!
๐ฃ ์ฐธ๊ณ ๋งํฌ
- https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf
- https://medium.com/@allansendagi/javascript-fundamentals-call-stack-and-memory-heap-401eb8713204
- https://blog.sessionstack.com/how-javascript-works-event-loop-and-the-rise-of-async-programming-5-ways-to-better-coding-with-2f077c4438b5
- https://stackoverflow.com/questions/52906975/call-stack-event-loop-why-waiting-for-empty-stackhttps://stackoverflow.com/questions/39879/why-doesnt-javascript-support-multithreading
'javaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ํด๋์ค ์์ ์ ์ฝ๋ฐฑ ํจ์ ์ ๋ฆฌ (0) | 2022.04.06 |
---|---|
JavaScript ๋ฐ๋ณต๋ฌธ (0) | 2021.04.22 |