thumbnail
๐ŸŽ  ๋น™๋น™ ๋Œ์•„๊ฐ€๋Š” JS ์—”์ง„์˜ ํšŒ์ „๋ชฉ๋งˆ
JavaScript
2022.01.31

๋‹ค์งœ๊ณ ์งœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ‘€

image

์ด๊ฒŒ ๋ฐ”๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๊ตฌ์กฐ๋กœ, ๊ทธ ์ค‘์—์„œ๋„ V8 ์—”์ง„์˜ ๊ตฌ์กฐ์ด๋‹ค.

JS Engine,

  • Memory Heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ์ด๋‹ค.
    ์—ฌ๊ธฐ์„œ Heap์€ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ๋„“์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๊ฐ์ฒด(๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜)๋“ค์ด ๋‹ด๊ธฐ๋Š” ๊ณณ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • Call Stack(ํ˜ธ์ถœ ์Šคํƒ) : ์‹คํ–‰๋  ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ํ• ๋‹น๋œ๋‹ค.

Web APIs,

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹น์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€์—์„œ๋Š” Web APIs, ๋…ธ๋“œ์—์„œ๋Š” Background๋กœ ์„ค๋ช…๋œ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. (DOM, Ajax, Timeout ๋“ฑ๋“ฑ)

Callback Queue,

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„์— ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์ด ์ฐจ๋ก€๋กœ ๋Œ€๊ธฐํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
Task Queue, Event Queue ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์„ค๋ช…๋˜๋Š”๋ฐ,
์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด Callback Queue ์•ˆ์— ์ € ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ Queue๋“ค์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค.

  • Queue : ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ์„ ์ž…์„ ์ถœ(FIFO)์˜ ๋ฃฐ์„ ๋”ฐ๋ฅธ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Event Loop!

Queue์— ํ• ๋‹น๋œ ํ•จ์ˆ˜๋“ค์„ ์ˆœ์„œ์— ๋งž์ถฐ Call Stack์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.
์ด ๋•Œ, Call Stack์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ผ ๋•Œ๋งŒ ๋ณด๋‚ด์ค€๋‹ค. ์ด๊ฑธ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ, ๋ฐ˜๋ณต์ ์ธ ํ–‰๋™์„ ํ‹ฑ(tick)์ด๋ผ๊ณ  ํ•œ๋‹ค.
๋งŒ์•ฝ์— ๋™๊ธฐ์ ์ธ ํ•จ์ˆ˜๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด, Web APIs, Callback Queue โ€ฆ ์ด๋Ÿฐ๊ฑฐ ํ•„์š”์—†๊ณ ,
Call Stack ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฝ”๋“œ ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๊ธฐ ๐Ÿค–

๋™๊ธฐ์ ์ธ ์ฝ”๋“œ

function first() {
  second();
  console.log('์ฒซ ๋ฒˆ์งธ');
}
function second() {
  third();
  console.log('๋‘ ๋ฒˆ์งธ');
}
function third() {
  console.log('์„ธ ๋ฒˆ์งธ');
}
first();
third();

Call Stack ๋‚ด๋ถ€์—์„œ๋Š”?

image

1๏ธโƒฃ ํ˜ธ์ถœ์ด ๋˜๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” anonymous(๋…ธ๋“œ์—์„œ๋Š” main)๊ฐ€ ๋จผ์ € ๋‹ด๊ธด๋‹ค.
2๏ธโƒฃ first(); ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋‹ด๊ธด๋‹ค.
3๏ธโƒฃ first(); ๋‚ด๋ถ€์˜ second();๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋‹ด๊ธด๋‹ค.
4๏ธโƒฃ second(); ๋‚ด๋ถ€์˜ third();๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋‹ด๊ธด๋‹ค.
5๏ธโƒฃ third(); ๋‚ด๋ถ€์˜ console.log('์„ธ ๋ฒˆ์งธ');๊ฐ€ ๊ทธ ์œ„๋กœ ์Œ“์ธ๋‹ค.
6๏ธโƒฃ ํ˜ธ์ถœ๋˜๋Š” ์ฝ”๋“œ๋“ค์ด Call Stack ๋‚ด๋ถ€์— ๋‹ค ์Œ“์˜€๋‹ค๋ฉด, ์ด ๋•Œ ์‹คํ–‰ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.


์‹คํ–‰ ๋‹จ๊ณ„

  • Stack์ด๋‹ˆ๊นŒ ๋งˆ์ง€๋ง‰์— ๋‹ด๊ธด ๊ฒƒ๋ถ€ํ„ฐ(๊ฑฐ๊พธ๋กœ์ˆœ) ๋จผ์ € ๋น ์ง€๋ฉด์„œ ์‹คํ–‰๋œ๋‹ค.

image

1๏ธโƒฃ console.log('์„ธ ๋ฒˆ์งธ');
2๏ธโƒฃ third();๋Š” ์‹คํ–‰๋˜์—ˆ์œผ๋‹ˆ Stack์—์„œ ๋น ์ง„๋‹ค.
3๏ธโƒฃ second();๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ console.log('๋‘ ๋ฒˆ์งธ'); ์ถœ๋ ฅํ•œ๋‹ค.
4๏ธโƒฃ second(); ๋น ์ง€๋ฉด์„œ first(); ์‹คํ–‰, console.log('์ฒซ ๋ฒˆ์งธ') ์ถœ๋ ฅํ•œ๋‹ค.
5๏ธโƒฃ first(); ํ•จ์ˆ˜ ๋™์ž‘์ด ๋๋‚œ๋‹ค.
6๏ธโƒฃ third(); ํ•จ์ˆ˜๊ฐ€ Call Stack์— ๋‹ด๊ธด๋‹ค.
7๏ธโƒฃ console.log('์„ธ ๋ฒˆ์งธ'); ์‹คํ–‰๋˜๋ฉด์„œ ์ถœ๋ ฅํ•œ๋‹ค.
8๏ธโƒฃ ์ตœ์ข…์ ์œผ๋กœ anonymous๊นŒ์ง€ ๋น ์ง€๋ฉด์„œ ์‹คํ–‰ ๋‹จ๊ณ„๋Š” ๋๋‚œ๋‹ค.


์ด์ œ Call Stack์„ ์•Œ๊ธฐ๋Š” ์•Œ์•˜๋Š”๋ฐ.. ๐Ÿ˜ณ

์‹คํ–‰ํ•˜๋‹ค๋ณด๋ฉด ์ฝœ์Šคํƒ์—์„œ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค.

image

โ€˜Uncaught RangeError: Maximum call stack size exceededโ€™

Call Stack ์‚ฌ์ด์ฆˆ๋ฅผ ์ดˆ๊ณผํ–ˆ๋‹ค๋Š” ์—๋Ÿฌ๋กœ, ์ฝœ์Šคํƒ๋งˆ๋‹ค ํ•œ๊ณ„์ ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ ํ•œ๊ณ„์ ์„ ์ดˆ๊ณผํ•˜๋ฉด ๋œจ๋Š” ์—๋Ÿฌ๋กœ,
์ฝœ์Šคํƒ ์•ˆ์— ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋‹ด๊ธฐ๋‹ค๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์„๋งŒํผ ๋งŽ์•„์ง€๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ํ™• ์ข…๋ฃŒ๋œ๋‹ค..
๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋งˆ๋‹ค ์ฝœ์Šคํƒ์˜ ํ•œ๊ณ„๋Š” ๋‹ค๋ฅด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ 1๋งŒ๊ฐœ์ด๊ณ  ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋Š” ์•ฝ 12๋งŒ๊ฐœ๋ผ๊ณ  ํ•œ๋‹ค.


๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ

  • ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ž‘๋™ ๋ฐฉ์‹์ด ํ•ต์‹ฌ!
console.log('์‹œ์ž‘');

setTimeout(function () {
  console.log('์ค‘๊ฐ„');
}, 3000);

console.log('๋');

image

ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ๋‹จ๊ณ„

1๏ธโƒฃ anonymous๊ฐ€ ๋จผ์ € ๋‹ด๊ธด๋‹ค.
2๏ธโƒฃ console.log('์‹œ์ž‘')์ด ์‹คํ–‰๋˜๊ณ  Stack์—์„œ ๋น ์ง€๋ฉด์„œ
3๏ธโƒฃ ์ฝ˜์†” ์ฐฝ์— โ€˜์‹œ์ž‘โ€™ ์ถœ๋ ฅ๋œ๋‹ค.
4๏ธโƒฃ setTimeout(์ต๋ช… ํ•จ์ˆ˜, 3์ดˆ) ์Œ“์ด๋ฉด์„œ
5๏ธโƒฃ Web APIs(=Background)๋กœ ๋„˜์–ด๊ฐ„ timeout์ด 3์ดˆ๋™์•ˆ ๋Œ€๊ธฐํ•œ๋‹ค.
6๏ธโƒฃ ๋Œ€๊ธฐํ•˜๋Š” ์‚ฌ์ด์— console.log('๋') ํ•จ์ˆ˜๊ฐ€ Stack์— ์Œ“์ด๊ณ  ๋น ์ง€๋ฉด์„œ
7๏ธโƒฃ ์ฝ˜์†” ์ฐฝ์— โ€˜๋โ€™ ์ถœ๋ ฅ๋˜๋ฉด์„œ anonymous๋„ Stack์—์„œ ๋น ์ง„๋‹ค.
8๏ธโƒฃ 3์ดˆ๊ฐ€ ๋œ ์‹œ์ ์— timeout์˜ ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ Callback Queue๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ Call Stack ์ž๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋น„์–ด์žˆ์„ ๋•Œ๋ฅผ ์ฒดํฌํ•œ ๋‹ค์Œ์—,
9๏ธโƒฃ ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” console.log('์ค‘๊ฐ„')์„ Stack์— ์Œ“๋Š”๋‹ค.
๐Ÿ”Ÿ ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ Stack์—์„œ ๋น ์ง€๋ฉด์„œ ์ฝ˜์†” ์ฐฝ์—๋Š” โ€˜์ค‘๊ฐ„โ€™ ์ถœ๋ ฅ๋˜๊ณ , ํ•ด๋‹น ์ฝ”๋“œ์˜ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ๋งˆ๋ฌด๋ฆฌ๋œ๋‹ค.

  • Call Stack์ด ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด โ€˜์ด๋ฒคํŠธ ๋ฃจํ”„โ€™๋กœ,
    ์Šคํƒ์ด ๋น„์–ด์žˆ๋‹ค๋ฉด Callback Queue์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. ๐Ÿ’ซ

์ด๋ฒˆ์—๋Š” Promise๋ฅผ ์ถ”๊ฐ€ํ•œ ๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

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

setTimeout(function () {
  console.log('์ค‘๊ฐ„');
}, 0);

Promise.resolve().then(function () {
  console.log('ํ”„๋กœ๋ฏธ์Šค');
});

console.log('๋');

ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ๋‹จ๊ณ„ 1/2

image

1๏ธโƒฃ anonymous๊ฐ€ ๋จผ์ € ๋‹ด๊ธด๋‹ค.
2๏ธโƒฃ console.log('์‹œ์ž‘')์ด ์‹คํ–‰๋˜๊ณ  Stack์—์„œ ๋น ์ง€๋ฉด์„œ
3๏ธโƒฃ ์ฝ˜์†” ์ฐฝ์— โ€˜์‹œ์ž‘โ€™ ์ถœ๋ ฅ๋œ๋‹ค.
4๏ธโƒฃ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout(์ต๋ช… ํ•จ์ˆ˜, 0์ดˆ)๊ฐ€ ์Œ“์ด๋ฉด์„œ
5๏ธโƒฃ Web APIs(=Background)๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
6๏ธโƒฃ ๋‹ค์Œ์œผ๋กœ Promise๊ฐ€ ๋„˜์–ด์˜ค๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๊ธฐ์–ตํ•ด๋‘์–ด์•ผ ํ•  ์ ์€ Promise๋Š” โ€˜๋™๊ธฐโ€™๋ผ๋Š” ์ ์ด๋‹ค.

๐Ÿ‘ฅ ๊ทธ๋Ÿฐ๋ฐ ์™œ ๋น„๋™๊ธฐ๋ผ๊ณ  ์ธ์‹ํ•˜๊ณ  ์žˆ์—ˆ์ง€..?
๐Ÿ‘ฉโ€๐Ÿ’ป Promise ์ž์ฒด๋Š” ๋™๊ธฐ์ธ๋ฐ, then์„ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„ ์—”์ง„์ด ๋น„๋™๊ธฐ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค!

7๏ธโƒฃ then์ด ์กด์žฌํ•˜๋Š” Promise๋Š” ๋น„๋™๊ธฐ๋กœ ์ธ์‹๋˜์–ด Web APIs์— ๋‹ด๊ธด๋‹ค.
8๏ธโƒฃ Web APIs์— ๋‹ด๊ธด setTimeout์˜ ์‹คํ–‰์ด ๋๋‚˜๊ณ  Callback Queue๋กœ ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ๋„˜์–ด๊ฐ”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
9๏ธโƒฃ ๊ทธ ๋‹ค์Œ์œผ๋กœ then์˜ ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ Callback Queue์— ๋„˜์–ด๊ฐ„๋‹ค.
๐Ÿ”Ÿ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ Call Stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌ๋ฅผ ํ•œ ํ›„์—, Queue์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ๋„˜๊ฒจ์ค„ํ…๋ฐ ๊ณผ์—ฐ ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋„˜๊ฒจ์ค„๊นŒ?!


์ •๋‹ต์€.. 60์ดˆ ํ›„ ๊ณต๊ฐœ๊ฐ€ ์•„๋‹Œ ์ง€๊ธˆ ๊ณต๊ฐœ!


ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ๋‹จ๊ณ„ 2/2

image

1๏ธโƒฃ Callback Queue์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์—ด์‹ฌํžˆ ์ง€์ผœ๋ณด๋Š”๋ฐ, Call Stack์—๋Š” ์•„์ง ์ฝ”๋“œ๋“ค์ด ์Œ“์—ฌ์žˆ์–ด์„œ ๋ฐ”๋กœ ๋„˜๊ฒจ์ฃผ์ง€ ๋ชปํ•œ๋‹ค. Call Stack์ด ๋น„๋Š” ์ˆœ๊ฐ„๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
2๏ธโƒฃ console.log('๋')์ด ์‹คํ–‰๋˜๊ณ , ์ฝ˜์†” ์ฐฝ์— โ€˜๋โ€™์ด ์ถœ๋ ฅ๋œ๋‹ค.
3๏ธโƒฃ ๋” ์ด์ƒ ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— anonymous๋Š” Stack์—์„œ ์‚ฌ๋ผ์ง€๊ณ  ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
4๏ธโƒฃ ์ด์ œ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ Queue์— ์žˆ๋Š” ์ต๋ช… ํ•จ์ˆ˜๋“ค์„ ๋„˜๊ฒจ์ค˜์•ผ ํ•  ์ฐจ๋ก€์ธ๋ฐ.. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋„˜๊ฒจ์ค„๊นŒ?

๐Ÿ‘ฅ ์•„~ Queue๋Š” ์„ ์ž…์„ ์ถœ, FIFO๋ผ์„œ timeout์˜ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋‚ด๋ณด๋‚ด๊ฒ ๋„ค!
๐Ÿ™…โ€โ™€๏ธ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.. ์šฐ์„ ์ˆœ์œ„๋•Œ๋ฌธ์— then์˜ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋„˜๊น๋‹ˆ๋‹ค~

5๏ธโƒฃ Promise then์˜ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ Queue์—์„œ ๋จผ์ € ๊บผ๋‚ด์–ด Stack์œผ๋กœ ๋„˜๊ธด๋‹ค.
6๏ธโƒฃ ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์˜ ์ฝ”๋“œ console.log('ํ”„๋กœ๋ฏธ์Šค')๋ฅผ ๋‹ด๊ณ 
7๏ธโƒฃ ์ฝ˜์†” ์ฐฝ์— โ€˜ํ”„๋กœ๋ฏธ์Šคโ€™ ์ถœ๋ ฅํ•˜๋ฉด์„œ Stack์—์„œ ๋น ์ง„๋‹ค.
8๏ธโƒฃ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ Queue์— ๋‚จ์•„์žˆ๋Š” timeout์˜ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์–ด Stack์œผ๋กœ ๋„˜๊ธด๋‹ค.
9๏ธโƒฃ ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์˜ ์ฝ”๋“œ console.log('์ค‘๊ฐ„')๋ฅผ ๋‹ด๊ณ 
๐Ÿ”Ÿ ์ฝ˜์†” ์ฐฝ์— โ€˜์ค‘๊ฐ„โ€™ ์ถœ๋ ฅํ•˜๋ฉด์„œ Stack์—์„œ ๋น ์ง„๋‹ค.


์ž ๊น ๐Ÿ‘‹ Callback Queue์˜ ์šฐ์„ ์ˆœ์œ„?

์œ„์—์„œ ๋ณธ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ง„ํ–‰์„ ๋ดค์„ ๋•Œ, Queue์— ๋‹ด๊ธด ์ต๋ช… ํ•จ์ˆ˜๋“ค์€ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ์„œ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์กŒ๋‹ค.

Callback Queue๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€์˜ ํ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

image


  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” Callback Queue์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ์„œ Call Stack์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

1์ˆœ์œ„. Microtask Queue (Job Queue) : Promise callback, async functions, โ€ฆ

2์ˆœ์œ„. Animation Frames

3์ˆœ์œ„. Task Queue (Event Queue) : setTimeout, setInterval, โ€ฆ


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

setTimeout(function () {
  console.log('์ค‘๊ฐ„');
}, 0);

Promise.resolve().then(function () {
  console.log('ํ”„๋กœ๋ฏธ์Šค');
});

requestAnimationFrame(function () {
  console.log('requestAnimationFrame');
});

console.log('๋');

์ด์ œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋™์ž‘ ๋ฐฉ์‹ (Microtask Queue > Animation Frames > Task Queue)์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ,
์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ๋ฐ”๋กœ ๋– ์˜ค๋ฅธ๋‹ค!

์ฝ˜์†” : ์‹œ์ž‘ > ๋ > ํ”„๋กœ๋ฏธ์Šค > requestAnimationFrame > ์ค‘๊ฐ„


โœจ ์ •๋ฆฌ

์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

๋‚œ ์—ฌํƒœ๊นŒ์ง€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ์•Œ์ง€๋„ ๋ชจ๋ฅธ ์ฑ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๊ฐ€๋ฅด์ณ ์ฃผ์ง€ ์•Š์•„์„œ, ๋“ค์€ ์ ์ด ์—†์—ˆ๋‹ค๊ณ  ๋ณ€๋ช…ํ•˜๊ธฐ๋„ ๋ถ€๋„๋Ÿฝ์ง€๋งŒ.. ๋‚ด๊ฐ€ ๋ญ˜ ๋ชจ๋ฅด๋Š”์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ ์•Œ์•„๋ณผ ์ƒ๊ฐ๋„ ์—†์—ˆ๋Š”๋ฐ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋–ค ๊ฐœ๋…๋“ค์ด ์žˆ๊ณ , ๋‚ด๊ฐ€ ์“ฐ๋Š” ์–ธ์–ด์™€ ๋™์ž‘ ์›๋ฆฌ ๊ฐ™์€ ๊ฑด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ๊ณ  ์จ์•ผ๊ฒ ๋‹ค๋Š” ๋‹ค์ง์„ ํ•œ ๋ฒˆ ๋” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค ๐Ÿ˜Œ


์ฐธ๊ณ  ๋‚ด์šฉ

์šฐ๋ฆฌ๋ฐ‹

์ด๋ฒคํŠธ ๋ฃจํ”„ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ˆˆ์œผ๋กœ ์ง์ ‘ ์ฒดํ—˜ํ•˜๊ธฐ

Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜Š
ยฉ2021 Developer minkyung choi, Powered By Gatsby.