Notice
Recent Posts
Recent Comments
Link
ยซ   2025/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐ŸŒฑ dreaming DiNO

[js] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ๊ตฌ์กฐ ๋ณธ๋ฌธ

javaScript

[js] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ๊ตฌ์กฐ

MK_____ 2022. 12. 6. 10:51

์ถœ์ฒ˜: 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์ด ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋™๊ธฐํ™” ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณจ๋จธ๋ฆฌ๋ฅผ ์•“์„ ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

 

 

 

 

๐Ÿ“ฃ ๊ฐ„๋‹จ ์ •๋ฆฌ 

 

๊ฒฐ๋ก ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ์— ๋™๊ธฐ์‹ ์–ธ์–ด์ด์ง€๋งŒ, ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋Ÿฐํƒ€์ž„๋“ค์˜ ๋„์›€์„ ๋ฐ›์•„์„œ ๋น„๋™๊ธฐ ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ๋งˆ์น˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์งฑ์งฑ ์‹ ๊ธฐํ•œ ์–ธ์–ด ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ž‘์›๋ฆฌ๋„ ์ข€ ํ—ท๊ฐˆ๋ ธ์—ˆ๋Š”๋ฐ ์ €๋„ ์š”๋ฒˆ์— ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•˜๋‚˜์”ฉ ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ ์‚ฌ๋žŒ์€ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผ ๊ธฐ์–ต์— ๋‚จ๋‚˜๋ด์š”!

 

 

 

 

 

๐Ÿ“ฃ ์ฐธ๊ณ  ๋งํฌ 

'javaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] ํด๋ž˜์Šค ์˜ˆ์ œ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ •๋ฆฌ  (0) 2022.04.06
JavaScript ๋ฐ˜๋ณต๋ฌธ  (0) 2021.04.22