JavaScript ๋™์ž‘ ์›๋ฆฌ :: ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ ๋™์ž‘ (feat. ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ)

JS ๋™์ž‘์›๋ฆฌ

js๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋ฏ€๋กœ ํ˜ธ์ถœ ์Šคํƒ์ด ํ•˜๋‚˜๊ณ  ํ•œ ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ฅธ ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ๋‹ค๋ฅธ ๋กœ์ง์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Ÿฐํƒ€์ž„

js ๋Ÿฐํƒ€์ž„์€ JS์—”์ง„, web api, task queue, event loop, render queue๋กœ ๋˜์–ด์žˆ๋‹ค.

 

์—”์ง„

js ์—”์ง„์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” Google์˜ V8 ์—”์ง„์ด๋‹ค. Chrome๊ณผ Node.js์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • memory heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
  • call stack : ํ˜ธ์ถœ ์Šคํƒ

์œ„์˜ ๋‘๊ฐ€์ง€๋กœ ์—”์ง„์€ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

 

Web API

DOM, Ajax, TimeOut ๋“ฑ์˜ Web API๊ฐ€ ์ž‡๋‹ค.

Callstack์—์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด Web API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  API๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ Task Queue์— ๋„ฃ๊ฒŒ ๋œ๋‹ค.

 

Event Loop

CallStack๊ณผ Task Queue์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜์—ฌ, CallStack์ด ๋น„์—ˆ์„ ๋•Œ Task Queue์˜ ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ์„ CallStack์œผ๋กœ ๋„ฃ๋Š”๋‹ค.

CallStack์€ ํ˜ธ์ถœ์„ ๋œปํ•˜๊ณ , Task Queue๋Š” Web api๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ฃผ์–ด์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋œปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด js ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ Web API ํ˜ธ์ถœ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ๋น„๋™๊ธฐ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ณ„์† CallStack์—์„œ ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์„œ ์‹คํ–‰ํ•œ๋‹ค. Web API๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋ฉด Task Queue์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ณ , CallStack์ด ๋นŒ ๋•Œ Task Queue์˜ ํ•จ์ˆ˜๋“ค์„ CallStack์œผ๋กœ ๋„ฃ๋Š”๋‹ค.

 

์ฝ”๋“œ๋กœ ๋ณด๊ธฐ

// Synchronous
[1,2,3,4].forEach(function(i) {
   console.log(i); 
});

// Asynchronous
function asyncForEach(array, cb) {
    array.forEach(function(){
       setTimeout(cb, 0); 
    });
}
asyncForEach([1,2,3,4], function(i){
    console.log(i); 
});

์ฒซ๋ฒˆ์งธ๋Š” JS ์—”์ง„์˜ Call Stack์— console.log ํ•จ์ˆ˜๊ฐ€ ๊ณ„์† ์Œ“์˜€๋‹ค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

๋‘๋ฒˆ์งธ๋Š” setTimeout์ด๋ผ๋Š” WebAPI ๋•Œ๋ฌธ์— TaskQueue๋กœ ์ด๋™๋˜์—ˆ๋‹ค๊ฐ€ Call Stack์ด ๋น„์—ˆ์„ ๋•Œ ์ถ”๊ฐ€๋˜์–ด ์‹คํ–‰๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์„ ์ด์šฉํ•˜๋ฉด ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์˜ ๋‹จ์ ์„ ๋ฉ”์šธ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ  : https://baeharam.github.io/posts/javascript/jshow-javascript-works/

๋ฐ˜์‘ํ˜•