๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ/๐Ÿ“š JS

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ด๋ฒคํŠธ๋ฃจํ”„

by megan07 2023. 12. 27.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ vs ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ฌด์Šจ ์ฐจ์ด์ผ๊นŒ?

๋™๊ธฐ ์ฒ˜๋ฆฌ

: ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ํƒœ์Šคํฌ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹
-> ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€๋งŒ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ดํ›„ ํƒœ์Šคํฌ๋“ค์€ ๋ธ”๋กœํ‚น ๋ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

: ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
-> ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์˜ˆ์‹œ

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


function b(){
	setTimeout(a, 300);
 	console.log('b'); 
}


b();


//์‹คํ–‰๊ฒฐ๊ณผ
//'b'
//'a'

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
aํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„์— bํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
setTimeoutํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—
bํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž์ฒด๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ
๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ธ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js์—์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํƒœ์Šคํฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๋ฃจํ”„์ž…๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์‹œ์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋™์‹œ์„ฑ: ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ
๋ณ‘๋ ฌ์„ฑ: ์‹ค์ œ๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ

JavaScript ์—”์ง„์€ Memory Heap๊ณผ Call Stack์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด Call Stack์— ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” Call Stack์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ, Callback Queue(Task Queue)์—์„œ ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด Call Stack์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ €์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
    1. Call Stack์— ์žˆ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๊ณ , ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์‹คํ–‰๋  ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ Callback Queue๋กœ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    2. ๊ทธ๋™์•ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Call Stack์— ์žˆ๋Š” ๋‚˜๋จธ์ง€ ๋™๊ธฐ ํ•จ์ˆ˜๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์„ ๋•Œ ์ฝœ๋ฐฑ ํ์—์„œ ์žˆ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์„ ์ฝœ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ setTimeoutํ•จ์ˆ˜๊ฐ€ 0์ดˆ ํ›„์— ์‹คํ–‰๋˜๊ฒŒ๋” ์„ค์ •์„ ํ•ด๋„ ๋ฐ”๋กœ ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

console.log('b')๊ฐ€ ๋จผ์ € ์‹คํ–‰๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


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


b();


//์‹คํ–‰๊ฒฐ๊ณผ
//'b'
//'a'

 

 

์ฝœ๋ฐฑ ํ์—๋Š” ์–ด๋–ค ์ข…๋ฅ˜๊ฐ€ ์žˆ์„๊นŒ?

์ฝœ๋ฐฑ ํ์˜ ์ข…๋ฅ˜๋กœ๋Š”
Task Queue, Microtask Queue,Animation Frames๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค

1. Microtask Queue :ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋ณด๊ด€๋จ

   : process.nextTick, Promises, queueMicroTask, MutationObserver

2. Animation Frames: requestAnimationFrame๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋ณด๊ด€๋จ

3. Task Queue:setTimeout ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ณด๊ด€๋จ

  : setTimeout, setInterval, setImmediate

 

 

๋ Œ๋”๋ง์€ ์–ธ์ œ ์‹คํ–‰๋ ๊นŒ?

๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ๋‹ค.

๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ์— ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์šฐ์„ ์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ํ•œ ํ›„ ๋ Œ๋”๋ง์„ ํ•œ๋‹ค.