JavaScript

Event Loop, Web APIs, (Micro)task Queue

presentKey 2024. 6. 15. 01:07

๐Ÿƒ‍โ™€๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋‹ค. ์ด๋Š” ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ”๋Š” blocking์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

๐Ÿ”ฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ๊ณผ์ •

Call Stack: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ๋˜๊ณ  ์ˆœ์ฐจ์  ์‹คํ–‰ ๋œ๋‹ค. ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

Web APIs: setTimeout, Promise ๋“ฑ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฝœ ์Šคํƒ์—์„œ ๊ฐ€์ ธ์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ํ•œ๋‹ค.

Task Queue: setTimeout๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ์˜์—ญ

Microtask Queue: ํ”„๋กœ๋ฏธ์Šค ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ‘then’, ‘catch’, ‘finally’์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜, await ์ดํ›„ ์ฝ”๋“œ ๋“ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ์˜์—ญ์ด๋‹ค. Task Queue๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.

Event Loop: ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€, (micro)task queue์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ, ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

์ด๋ฏธ์ง€ ๋ฐ ์˜์ƒ ์ฐธ๊ณ 
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
  1. Call Stack์— ํ•จ์ˆ˜๊ฐ€ ํ‘ธ์‹œ๋˜๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ ํ›„ ์ œ๊ฑฐ๋œ๋‹ค.
  2. ๋งŒ์•ฝ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ setTimeout ์ด ํ‘ธ์‹œ๋˜๋ฉด, Web APIs ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  3. ์ง€์ •๋œ ๋”œ๋ ˆ์ด ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„, setTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ Task Queue ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  4. EventLoop๊ฐ€ ์ฝœ ์Šคํƒ์ด ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ ํ›„, Task Queue์— ๋Œ€๊ธฐ ์ค‘์ด๋˜ setTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ Call Stack์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  5. SetTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

๐Ÿ‘€ ์—ผ๋‘ํ•  ์ 

Event Loop๋Š” Queue์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ Call Stack์ด ๋น„์–ด์žˆ์„ ๋•Œ๋งŒ ๋ณด๋‚ธ๋‹ค. ๋งŒ์•ฝ Call Stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, setTimeout์˜ ์ง€์ •๋œ ๋”œ๋ ˆ์ด ์‹œ๊ฐ„๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Microtask Queue๊ฐ€ Task Queue๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค. Microtask Queue์— ๋Œ€๊ธฐ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์—†์„๋•Œ๊นŒ์ง€ Task Queue์˜ ํ•จ์ˆ˜๋Š” Call Stack์œผ๋กœ ์ด๋™ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

๐Ÿงท ์ฐธ๊ณ 

https://www.lydiahallie.com/blog/event-loop

https://www.youtube.com/watch?v=eiC58R16hb8

https://dkrnfls.tistory.com/362