Programming/JavaScript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„

dayeon.O_O.dev 2022. 4. 8. 19:44

๐Ÿ‘‰ ๊ธฐ์กด Velog์—์„œ ์ด์ „ํ•œ ๊ฒŒ์‹œ๋ฌผ์ž…๋‹ˆ๋‹ค. JS Deep Dive์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ฒŒ์‹œ๊ธ€์ด ์žˆ์–ด์š”.

 

์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค. ์•Œ์•„๋ณด์ž!๐Ÿ˜


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด๋ผ๋Š” ๋…€์„์„ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค!
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ...
  • V8, SpiderMonkey, Webkit...
  • ์›น ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ๋˜๋Š” Node.js ์•ˆ์— ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ
  • ํž™(Memory Heap)๊ณผ ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ์ „ํ†ต์ ์œผ๋กœ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์ง€๋งŒ, ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ JIT๋ฅผ ์ €์žฅํ•ด๋†จ๋‹ค๊ฐ€ ์ปดํŒŒ์ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿ’ก ์ธํ„ฐํ”„๋ฆฌํ„ฐ vs ์ปดํŒŒ์ผ๋Ÿฌ

์ธํ„ฐํ”„๋ฆฌํ„ฐ : ๋ฐ”๋กœ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰
์ปดํŒŒ์ผ๋Ÿฌ : ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ์†Œ์Šค์ฝ”๋“œ → ๊ธฐ๊ณ„์–ด


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ & ์™ธ๋ถ€ ๊ตฌ์กฐ


์—”์ง„์€ ํฌ๊ฒŒ Call Stack๊ณผ Heap์œผ๋กœ ๋‚˜๋‰˜๊ณ ,

์—”์ง„ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๊ตฌ์กฐ

Call Stack

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋‹จ ํ•˜๋‚˜์˜ ํ˜ธ์ถœ ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ Task๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์— ๋‹ด์•„ ์ฒ˜๋ฆฌ๋œ๋‹ค.

Heap

  • ๋„“์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜. ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ œ๊ฑฐํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์™ธ๋ถ€์˜ ์š”์†Œ

Web APIs

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

Callback Queue

  • = Task Queue = Event Queue
  • ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์ด ๋‹ด๊ธฐ๋Š” ํ ๋ฆฌ์ŠคํŠธ (→ ์ฝœ๋ฐฑ์ด ํ์ฒ˜๋Ÿผ ์Œ“์ž„)
  • FIFO(First in First Out) ๋ฐฉ์‹
  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ฝœ ์Šคํƒ์ด ๋น„์›Œ์กŒ๋Š”์ง€ ์ˆ˜์‹œ๋กœ ํ™•์ธํ•˜๋‹ค๊ฐ€, ๋น„์›Œ์ง„ ์ˆœ๊ฐ„ Task Queue์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ Call Stack์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋„˜๊ฒจ ์‹คํ–‰์‹œํ‚จ๋‹ค.

Event Loop

  • ์›น ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(ํ•œ ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)์ธ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ
  • Call Stack๊ณผ Task Queue์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ์ฒดํฌํ•œ๋‹ค.
  • Call Stack์ด ๋น„์–ด์žˆ์„ ๋•Œ, Task Queue์˜ ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ์„ Call Stack์œผ๋กœ ๋ฐ€์–ด๋„ฃ๋Š”๋‹ค.

Nexttick Queue

Microtask Queue

Animation Frames

  • requestAnimationFrame API๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ฝœ๋ฐฑ์ด Animation Frames์œผ๋กœ ๋‹ด๊ธด๋‹ค.

Event Queue

  • Task Queue์™€ ๋™์ผํ•œ ์—ญํ• 

Job Queue

  • Microtask Queue์™€ ๋™์ผํ•œ ์—ญํ• 

์šฐ์„ ์ˆœ์œ„

  • ํฌ๋กฌ ๊ธฐ์ค€
  • Nexttic Queue → Microtask Queue → Animation Frames → Task Queue