Skip to content

Latest commit

ย 

History

History
137 lines (89 loc) ยท 5.57 KB

event-loop.md

File metadata and controls

137 lines (89 loc) ยท 5.57 KB

๐Ÿ’ป Event Loop

event-loop


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป JS Engine(์ƒ๋‹จ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Memory Heap๊ณผ Call Stack์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.(ex. ๊ตฌ๊ธ€์˜ V8 Engine)
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ(Single Thread) ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ๋ฐ, ์ด ์˜๋ฏธ๋Š” Call Stack์ด ํ•˜๋‚˜๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค.
    • Memory Heap: ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ(ex. ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ์ด ๋‹ด๊ฒจ์ ธ ์žˆ์Œ)
    • Call Stack: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์Œ“์ด๋Š” ๊ณณ Stack ํ˜•ํƒœ๋กœ ์Œ“์ธ๋‹ค. (Stack์€ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ํ›„์ž…์„ ์ถœ(LIFO) ๋ฐฉ์‹์ด๋‹ค.)
  • ๋‹จ์ผ ์ฝœ ์Šคํƒ์„ ๊ฐ–๋Š” ๋‹ค๋Š” ์˜๋ฏธ๋Š”, ์š”์ฒญ์ด ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์ธ ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.js๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Web API

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

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Event Loop

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

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Callback Queue

  • Callback Queue์—๋Š” Task Queue์™€ Microtask Queue๊ฐ€ ์žˆ๋‹ค.
  • Task Queue๋Š” setTimeout(), setInterval(), UI๋ Œ๋”๋ง, requestAnimationFrame()์ด ๋‹ด๊ธด๋‹ค.
  • Microtask Queue๋Š” Promise(then), MutaionObserver๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • Event Loop๋Š” ์šฐ์„ ์ ์œผ๋กœ Microtask Queue๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ, Microtask Queue์— ์ฝœ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ๋จผ์ € Call Stack์— ๋‹ด๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  Microtask Queue์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด, Task Queue์— ํ™•์ธ ํ›„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๋™์ž‘ ์˜ˆ์‹œ 1)
console.log('script start');

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

Promise.resolve()
  .then(function () {
    console.log('promise1');
  })
  .then(function () {
    console.log('promise2');
  });

console.log('script end');

  • ๊ฒฐ๊ณผ
  script start
  script end
  promise1
  promise2
  setTimeout

  • ์œ„ ๊ฒฐ๊ณผ์˜ ์ด์œ ๋Š” Promise๋Š” Microtask Queue์— ๋‹ด๊ธฐ๊ณ , setTimeout์€ Task Queue์— ๋‹ด๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ Promise์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ setTimeout์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋Š” ๋™์ž‘ ๋ฐฉ์‹

  console.log('์ฝœ ์Šคํƒ!');
  setTimeout(() => console.log('ํƒœ์Šคํฌ ํ!'), 0);
  Promise.resolve().then(() => console.log('๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ!'));

  //๊ฒฐ๊ณผ
  ์ฝœ ์Šคํƒ!
  ๋งˆ์ดํฌ๋กœํƒœ์ŠคํŠธ ํ!
  ํƒœ์ŠคํŠธ ํ!

eventlooptask1

  • ์ œ์ผ ๋จผ์ €, '์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰' Task๊ฐ€ Task Queue์— ๋“ค์–ด๊ฐ„๋‹ค.

eventlooptask2

  • ์ดํ›„, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๊ทธ Task๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋กœ๋“œ ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ ๋งจ ์ฒ˜์Œ์— console.log๊ฐ€ ์‹คํ–‰ ๋œ๋‹ค.

eventlooptask3

  • ๊ทธ ๋‹ค์Œ, setTimeout() ์ด Call Stack์œผ๋กœ ๊ฐ€๊ณ  Web API๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„์„œ ํƒ€์ด๋จธ๋ฅผ ๋™์ž‘์‹œํ‚จ๋‹ค.

eventlooptask4

  • ํƒ€์ด๋จธ๊ฐ€ ๋๋‚˜๋ฉด, setTimeout()์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ Task Queue์— ๋„ฃ๋Š”๋‹ค.

eventlooptask5

  • Promise๊ฐ€ Call Stack์œผ๋กœ ๊ฐ€๊ณ  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ Microtask Queue์— ๋„ฃ๋Š”๋‹ค.

eventlooptask6

  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” Microtask Queue์—์„œ ์ œ์ผ ์˜ค๋ž˜๋œ Task์ธ Promise์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ Call Stack์— ๋„ฃ๋Š”๋‹ค.

eventlooptask7

  • Promise์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ณ  Task Queue์—์„œ ์ œ์ผ ์˜ค๋ž˜ ๋œ Task์ธ setTimeout()์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ Call Stack์— ๋„ฃ๋Š”๋‹ค.

eventlooptask8

  • setTimeout()์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด Call Stack์ด ๋น„๊ฒŒ ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

์ฐธ๊ณ 

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/event-loop.md
https://velog.io/@thms200/Event-Loop-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84