EventLoop ์ด๋ฏธ์ง€

JS ์—”์ง„์€ Memory Heap / Call Stack๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, JS๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ(ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์ƒํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ํ™˜๊ฒฝ)๋‹ค.

JS๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ(single thread)์ธ๋ฐ ์ฆ‰, Call Stack์ด ํ•œ ๊ฐœ(single)๋ผ๋Š” ๋œป์ด๋‹ค.

(๊ฐ€์žฅ ์œ ๋ช…ํ•œ JS ์—”์ง„์œผ๋กœ๋Š” ๊ตฌ๊ธ€์˜ V8 Engine์ด ์žˆ๋‹ค)


Memory Heap

  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ (๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ)

Call Stack

  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์Œ“์ด๋Š” ๊ณณ. (stack : ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜, ์„ ์ž…ํ›„์ถœ)

Web API

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API (DOM, Ajax, Timeout ๋“ฑ)
  • Call Stack์—์„œ ์‹คํ–‰๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” Web API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , Web API๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ Callback Queue ์•ˆ์— ๋„ฃ๋Š”๋‹ค.

Callback Queue

  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋ณด๊ด€๋˜๋Š” ๊ณณ (setTimeout, addEventListener ๋“ฑ) (Queue : ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜, ์„ ์ž…์„ ์ถœ)

Event Loop

  • Call Stack๊ณผ Callback Queue ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜์—ฌ, Callback์ด ๋นˆ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, Callback Queue์˜ ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ์„ Call Stack์œผ๋กœ ๋„ฃ๋Š”๋‹ค. (์ด๋Ÿฐ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ํ‹ฑ(tick)์ด๋ผ ํ•œ๋‹ค)

Event Loop ๋™์ž‘์›๋ฆฌ

  1. V8 ์—”์ง„์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, Call Stack์ด ์Œ“์ธ๋‹ค.
  2. Stack์˜ ์„ ์ž…ํ›„์ถœ์˜ ๋ฃฐ์— ๋”ฐ๋ผ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋ฉฐ, Stack์— ์Œ“์—ฌ์ง„ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋œ๋‹ค.
    • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด Web API ํ˜ธ์ถœ๋˜๊ณ 
    • Web API๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ Callback Queue์— ๋„ฃ๋Š”๋‹ค.
    • Event Loop๋Š” Call Stack์ด ๋นˆ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, Callback Queue์— ์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ์„ Call Stack์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (์ด๋Ÿฌํ•œ ๋ฐ˜๋ณต ์ž‘์—…์„ ํ‹ฑ์ด๋ผ ํ•œ๋‹ค.)

โญ๏ธ JS๊ฐ€ ์”ฝ๊ธ€(๋‹จ์ผ) ์Šค๋ ˆ๋“œ์ง€๋งŒ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง€๋Š” ์ด์œ ๋Š”, Web APIโˆ™Callback Queueโˆ™Event Loop์˜ ์ž‘๋™์›๋ฆฌ ๋•Œ๋ฌธ์ด๋‹ค.


์ฐธ๊ณ ๋งํฌ

The event loop

JavaScript ๋น„๋™๊ธฐ ํ•ต์‹ฌ Event Loop ์ •๋ฆฌ

Event Loop (์ด๋ฒคํŠธ ๋ฃจํ”„)