๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

Javascript Call Stack, Callback Queue, Event Loop ๋ณธ๋ฌธ

Study/React

Javascript Call Stack, Callback Queue, Event Loop

Shinjio 2024. 11. 29. 23:45
๋ฐ˜์‘ํ˜•

์ด๋ฒˆ์— 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');

 

  1. console.log(’first’)๊ฐ€ Call Stack์— ์ถ”๊ฐ€(push)๋œ๋‹ค.
  2. console.log(’first’)๊ฐ€ ์‹คํ–‰๋˜์–ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋œ ํ›„, Call Stack์—์„œ ์ œ๊ฑฐ(pop) ๋œ๋‹ค.
  3. setTimeout(function cb…)์ด Call Stack์— ์ถ”๊ฐ€๋œ๋‹ค.
  4. setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” timer Web API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ ํ›„ Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  5. console.log(’third’)๊ฐ€ Call Stack์— ์ถ”๊ฐ€๋œ๋‹ค.
  6. console.log(’third’)๊ฐ€ ์‹คํ–‰๋˜์–ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๊ณ  Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  7. setTimeout ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ 1000ms ์‹œ๊ฐ„์ด ์ง€๋‚œ ๋’ค Callback์œผ๋กœ ์ „๋‹ฌํ•œ cb ํ•จ์ˆ˜๊ฐ€ Callback Queue์— ์ถ”๊ฐ€๋œ๋‹ค.
  8. Event Loop๋Š” Call Stack์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  Callback Queue๋ฅผ ์‚ดํŽด ๋ณธ๋‹ค. cb๋ฅผ ๋ฐœ๊ฒฌํ•œ Event Loop๋Š” Call stack์—cb ์ถ”๊ฐ€
  9. cb ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚ด๋ถ€์˜ console.log(’second’)๊ฐ€ Call Stack์— ์ถ”๊ฐ€๋œ๋‹ค.
  10. console.log(’second’)๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๊ณ  Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  11. cb๊ฐ€ Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

์œ„์™€ ๊ด€๋ จํ•œ ์ž์„ธํ•œ ๊ธ€์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. 

https://medium.com/sjk5766/javascript-๋น„๋™๊ธฐ-ํ•ต์‹ฌ-event-loop-์ •๋ฆฌ-422eb29231a8

 

setTimeout vs setInterval
setTimeout: ์ง€์ •๋œ ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ํ›„์— ํ•œ ๋ฒˆ๋งŒ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต setInterval: ์ผ์ •ํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ง€์ •๋œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต clearInterval: setInterval() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๋•Œ, clearInterval() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ์ค‘์ง€(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€)

 

์ฐธ๊ณ ์ž๋ฃŒ

https://wikidocs.net/251942

https://velog.io/@qlgks1/javascript-node-๋™์ž‘-์›๋ฆฌ

https://velog.io/@somda/FE-JavaScript-๋™์ž‘-๊ณผ์ •-Callback-Queue-Event-Loop

https://medium.com/sjk5766/javascript-๋น„๋™๊ธฐ-ํ•ต์‹ฌ-event-loop-์ •๋ฆฌ-422eb29231a8

 

๋ฐ˜์‘ํ˜•