๐ŸŒ€ 19. JavaScript Event Loop ์ •๋ฆฌ โ€” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ๋ฆ„ ์ด์ œ๋Š” ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์‹ถ์—ˆ๋‹ค

JM_Devยท2025๋…„ 5์›” 1์ผ
1
post-thumbnail

JS๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ง€๋งŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•œ๋‹ค.
๊ทธ ์ค‘์‹ฌ์—๋Š” ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ญ”์ง€,
call stack, task queue, microtask queue, Web APIs๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€
์ •ํ™•ํžˆ ์•Œ๊ณ  ์‹ถ์–ด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


โœ… ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋‹ค

๋™์‹œ์— ํ•œ ์ค„์”ฉ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ setTimeout๋„ ๋˜๊ณ , fetch๋„ ๋˜๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ๋„ ์ฒ˜๋ฆฌ๋ ๊นŒ?

๊ทธ๊ฑด JS๊ฐ€ Web API์™€ ๋น„๋™๊ธฐ ํ(Task Queue, Microtask Queue)๋ฅผ ํ™œ์šฉํ•ด์„œ
์‹ค์ œ๋กœ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


โœ… ์ „์ฒด ๊ตฌ์กฐ: Event Loop ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ

+------------------+     +---------------------+
|  Call Stack      |<----|    Event Loop       |
+------------------+     +---------------------+
        ^   ^                         |
        |   |                         โ†“
+------------------+        +------------------+
| Task Queue       |<-------|  Web APIs (DOM, setTimeout, etc.)
+------------------+        +------------------+
        ^
        |
+------------------+
| Microtask Queue  |
| (Promise, queueMicrotask) |
+------------------+

โœ… ์‹คํ–‰ ์ˆœ์„œ ์š”์•ฝ

  1. ์ฝ”๋“œ๊ฐ€ Call Stack์—์„œ ์‹คํ–‰๋œ๋‹ค.
  2. ๋น„๋™๊ธฐ ์ž‘์—…(setTimeout, fetch ๋“ฑ)์€ Web API์— ๋„˜๊ธด๋‹ค.
  3. ์™„๋ฃŒ๋œ ์ž‘์—…์€ Queue์— ๋“ค์–ด๊ฐ„๋‹ค.
  4. Microtask Queue๊ฐ€ ํ•ญ์ƒ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.
  5. ๊ทธ ๋‹ค์Œ Task Queue์˜ ์ž‘์—…์ด ์‹คํ–‰๋œ๋‹ค.
  6. ์ด ๋ชจ๋“  ํ๋ฆ„์„ Event Loop๊ฐ€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

โœ… ์˜ˆ์ œ๋ฅผ ํ†ตํ•œ ํ๋ฆ„ ์ดํ•ด

console.log('์‹œ์ž‘');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('promise');
});

console.log('๋');

์ถœ๋ ฅ ์ˆœ์„œ

์‹œ์ž‘  
๋  
promise  
setTimeout  

์ด์œ 

  • console.log('์‹œ์ž‘') โ†’ Call Stack ์‹คํ–‰
  • setTimeout โ†’ Web API๋กœ ๋„˜๊ฒจ์ง โ†’ Task Queue๋กœ ๋Œ€๊ธฐ
  • Promise.then โ†’ Microtask Queue์— ๋“ฑ๋ก๋จ
  • console.log('๋') โ†’ Call Stack ์‹คํ–‰

โœ… Microtask(Promise) โ†’ Task(setTimeout) ์ˆœ์„œ๋กœ ์‹คํ–‰๋จ


โœ… ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ vs ํƒœ์Šคํฌ

๊ตฌ๋ถ„์„ค๋ช…์˜ˆ์‹œ
Microtaskํ˜„์žฌ ์‹คํ–‰ ๋๋‚˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰๋จPromise.then, queueMicrotask
Task๋‹ค์Œ ํ‹ฑ(tick)์—์„œ ์‹คํ–‰๋จsetTimeout, setInterval, DOM ์ด๋ฒคํŠธ

โœ… ์‹ค์ „์—์„œ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ

๋ฌธ์ œ: setState ๋ฐ”๋กœ ๋‹ค์Œ์— ์ƒํƒœ๊ฐ€ ์•ˆ ๋ฐ”๋€œ

setValue(1);
console.log(value); // ์ด์ „ ๊ฐ’ ์ถœ๋ ฅ๋จ

์ด์œ : setState๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ โ†’ Microtask๋กœ ์˜ˆ์•ฝ๋จ
๊ทธ๋ž˜์„œ ์ฝ”๋“œ ํ๋ฆ„์—์„  ์•„์ง ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์€ ์ƒํƒœ์ž„

โ†’ ํ•ด๊ฒฐ: useEffect, useLayoutEffect ๋“ฑ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ


โœ… ์š”์•ฝ & ํ๋ฆ„ ์ •๋ฆฌ

  • JS๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ง€๋งŒ Web API + Queue ๊ตฌ์กฐ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ
  • Event Loop๋Š” Call Stack์ด ๋น„๋ฉด Microtask โ†’ Task ์ˆœ์œผ๋กœ ํ๋ฅผ ์ฒ˜๋ฆฌ
  • ๋น„๋™๊ธฐ ํ๋ฆ„์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด setTimeout, Promise, fetch, async/await ๋™์ž‘ ์ˆœ์„œ๋ฅผ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์†”์งํžˆ "JS๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋‹ˆ๊นŒ ๋А๋ ค" ์ •๋„๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ,
์ด๋ฒˆ์— Event Loop ๊ตฌ์กฐ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ
๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ๋ˆˆ์— ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ด์ œ๋Š” setTimeout, Promise, fetch๋ฅผ ์“ฐ๊ธฐ ์ „์—
โ€œ์ด๊ฑด ํ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ฒ ์ง€โ€ ํ•˜๊ณ  ํ๋ฆ„์ด ๊ทธ๋ ค์ง„๋‹ค.


๐Ÿ”„ โ€œ๋น„๋™๊ธฐ๋ฅผ ์•ˆ๋‹ค๊ณ  ๋งํ•˜๋ ค๋ฉด, ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€