๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

Call stack๊ณผ Event loop๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ์ˆ™์ง€ํ•ด์•ผํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํฌ๊ฒŒ Memory heap, call stack, web apis, callback queue, event loop๊ฐ€ ์žˆ๋‹ค.

 

 

 

Call Stack

ํ˜ธ์ถœ ์Šคํƒ์€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์Šคํƒ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ˆœ์„œ๋Œ€๋กœ ์Šคํƒ์— ๋‹ด๊ณ , ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” LIFO(Last In First Out) ๊ตฌ์กฐ์ด๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ˜ธ์ถœ ์Šคํƒ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ task๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function fifth(){console.log(5)}
function fourth() { fifth()
                  console.log(4)}
function third() { fourth()
                 console.log(3)}
function second() { third()
                  console.log(2)}
function first() { second()
                 console.log(1)}

first(); 

// first ํ˜ธ์ถœ์‹œ ๊ฒฐ๊ณผ๊ฐ’
// 5 4 3 2 1

 

์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ตœ์ƒ๋‹จ ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ first๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๊ณ , second๋ถ€ํ„ฐ fifth๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ํ˜ธ์ถœ๋˜๊ณ  ๋งˆ์ง€๋ง‰ fifth ํ•จ์ˆ˜๋ถ€ํ„ฐ ์‹คํ–‰๋˜๊ณ  ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋™๊ธฐ ๋กœ์ง์—์„œ๋Š” ํ•˜๋‚˜์˜ task๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ Task๋Š” ์‹คํ–‰๋˜์ง€ ๋ชปํ•˜๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

Callback Queue

Callback Queue๋Š” ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. Call stack๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” FIFO(First In First Out) ๊ตฌ์กฐ๋‹ค. ํŠน์ • ์ด๋ฒคํŠธ์— ๋”ฐ๋ฅธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” Callback Queue์— ์ €์žฅ๋œ๋‹ค.

 

Event Loop

Event Loop๋Š” Call stack์ด ๋‹ค ๋น„์›Œ์ง€๋ฉด Callback queue์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

  1. ํ˜ธ์ถœ ์Šคํƒ์˜ ์ž‘์—…์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์—ˆ์„ ๊ฒฝ์šฐ. Microtask Queue๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด Call Stack์— ๋„ฃ๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ๋งŒ์•ฝ Mircrotask Queue๊ฐ€ ๋น„์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” Animation Frames๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด Call Stack์— ๋„ฃ๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  4. 1~3 ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚œ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ Callback Queue๋ฅผ ํ™•์ธํ•˜๊ณ  ์ด์ „ ๊ณผ์ •๊ณผ ๊ฐ™์ด Call Stack์— ๋„ฃ๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

* ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €(V8) ๊ธฐ์ค€ Microtask Queue -> Animation Frames-> Callback Queue ์˜ ์ˆœ์„œ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋™์ž‘์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๋ ค๋ฉด http://latentflip.com/loupe/ 

์—ฌ๊ธฐ์„œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์™€ ํƒœ์Šคํฌ ํ, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์ง€๋งŒ, ์ด๋ฒคํŠธ๋ฃจํ”„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ข‹๋‹ค.

 

 

 

 

์ถœ์ฒ˜:

 

Javascript ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋™์ž‘์›๋ฆฌ (feat. EventLoop)

Overview ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ตœ๊ทผ Javascript๊ด€๋ จ ํฌ์ŠคํŒ… 3๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ๊ถ๊ธˆํ–ˆ๋˜ ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (1) ํ˜ธ๋‹ค๋‹ฅ ํ†บ์•„๋ณด๋Š” Callback ํ•จ์ˆ˜ (2) ํ˜ธ๋‹ค๋‹ฅ ํ†บ์•„๋ณด๋Š” Promise (3) ํ˜ธ๋‹ค๋‹ฅ ํ†บ

gruuuuu.github.io

 

 

(JavaScript) ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ์ •๋ง ์˜ค๋žœ๋งŒ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒํŠธ ๊ฐ•์ขŒ๋ฅผ ์˜ฌ๋ฆฌ๋„ค์š”. ์‚ฌ์‹ค ์›ฌ๋งŒํ•œ ๊ฒƒ๋“ค์€ ๋‹ค ๋‹ค๋ค˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ 50๊ฐ•์œผ๋กœ ๋๋‚ด๋ ค

www.zerocho.com

 

 

8. Javascript์˜ ์ฝœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์ž ๊น ๋‹ค๋ฃจ์—ˆ๋˜ ์ฝœ ์Šคํƒ(call stack)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์กฐ๊ธˆ ๋” ๋‚˜์•„๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•œ ์ˆœ๊ฐ„ ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋™์‹œ์— ๋งŽ

frontj.com