setTimeout์€ ๋ฌด์กฐ๊ฑด ์ง€์ •๋œ ์‹œ๊ฐ„ ์ดํ›„์— ์‹คํ–‰๋ ๊นŒ?

๐Ÿง™โ€โ™€๏ธ ํ˜ธ๊ธฐ์‹ฌ

์–ผ๋งˆ์ „ ์ธํ„ฐ๋ทฐ๋ฅผ ํ•˜๋ฉด์„œ ๋ฐ›์€ ์งˆ๋ฌธ์ด ์žˆ์—ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๊ด€๋ จ๋œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ•˜๋ฉด์„œ ๋ฐ›์€ ์งˆ๋ฌธ์ด์˜€๋Š”๋ฐ,

setTimeout(() => {
  console.log('์‹คํ–‰')
}, 60์ดˆ)

setTimeout์€ ๋”ฑ 60์ดˆ๋’ค์— ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋‚˜์š”?

๋‚ด๊ฐ€ ๋Œ€๋‹ตํ•œ ๋‹ต๋ณ€์€

์•„๋‹ˆ์š”

์˜€๋‹ค.

๐Ÿ˜‚ ์ž์‹ ์—†๋Š” โ€œ์•„๋‹ˆ์š”โ€์˜ ๊ทผ๊ฑฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์ด๋‹ค. ํ•˜๋‚˜์˜ ์ž‘์—…์˜์—ญ์ธ Stack์— ์ž‘์—…์ด ์Œ“์ด๊ณ , ์„ ์ž… ํ›„์ถœ์˜ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

๊ทธ ์ค‘์—์„œ๋„ setTimeout, Promise, Callbackํ•จ์ˆ˜ ๋“ฑ์˜ ๋น„๋™๊ธฐ webApi ๋“ค์€ ํ˜ธ์ถœ์ด ๋˜๋ฉด, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์˜์—ญ์—์„œ ํ•„์š”ํ•œ ์‹œ๊ฐ„ ํ˜น์€ ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋œ ํ›„ Que ์ž๋ฃŒ๊ตฌ์กฐ์— ์ดํ›„์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค.

๊ฐ๊ฐ์˜ task, microTask์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋‹ด๊ธฐ๊ฒŒ ๋˜๊ณ , Promise์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ธฐ๋Š” microTask์˜ Que ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์„ ์ž…์„ ์ถœ์˜ ๋ฐฉ์‹์œผ๋กœ task๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๊ฐ€ ๋น„์–ด์žˆ์Œ์„ ๊ฐ์ง€ํ•œ๋‹ค์Œ ๋‹ค์Œ que์˜ ์ž‘์—…์„ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ํŒ๋ณ„ํ•˜๊ณ  ์ž‘์—…์„ ์˜ฎ๊ฒจ์ฃผ๋Š”๊ฒƒ์ด EventLoop์˜€๋‹ค.

๋‚ด๊ฐ€ ์•Œ๊ธฐ๋ก  ์ด๋ ‡๋‹ค..

๋”ฐ๋ผ์„œ, ์šฐ์„ ์ˆœ์œ„์—์„œ ๋ฐ€๋ฆฌ๊ฒŒ๋˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์—…์ด que์— ์ค‘์ฒฉ์ด๋˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์–ด๋–ค ๊ฒฝ์šฐ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„์— ๋”ฑ ์ˆ˜ํ–‰๋˜์ง€๋Š” ์•Š์„๊ฒƒ ๊ฐ™๋‹ค ๋ผ๋Š” ๋‹ต์„ ํ•˜์˜€๋‹ค.

๐Ÿฅต ๊ณผ์—ฐ ๋งž์„๊นŒ?

๋‹น์—ฐํžˆ ์ธํ„ฐ๋ทฐ์—์„œ ๋‚˜์˜ ๋‹ต๋ณ€์ด ์ •๋‹ต์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์–˜๊ธฐํ•ด์ฃผ์‹œ์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ž˜์„œ ๊ถ๊ธˆ์ฆ์— ํ•œ๋ฒˆ ์‹คํ—˜์„ ํ•ด๋ณด์•˜๋‹ค.

๐Ÿ”ฎ setTimeout ์‹คํ—˜

์ฐธ๊ณ ๋กœ ์ด ์‹คํ—˜์˜ ์ •ํ™•์„ฑ์€ ์ œ๋กœ์ž…๋‹ˆ๋‹ค. ๊ทนํžˆ ์ฃผ๊ด€์ ์ธ ์ƒ๊ฐ์ด ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout(() => {
  console.log(`์ฒซ๋ฒˆ์งธ setTimeout ์‹คํ–‰์‹œ๊ฐ„ : ${new Date().getTime()}`)
}, 0)
setTimeout(() => {
  console.log(`๋‘๋ฒˆ์งธ setTimeout ์‹คํ–‰์‹œ๊ฐ„ : ${new Date().getTime()}`)
}, 0)
console.log(`์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฝํžŒ ์‹œ๊ฐ„ : ${new Date().getTime()}`)

๐Ÿฏ ์กฐ๊ฑด

  • ๋‘๊ฐ€์ง€์˜ setTimeout์€ ๋ชจ๋‘ 0์ดˆ ๋’ค์— ์‹คํ–‰๋˜๋„๋ก ํ•˜๋ฉฐ, ์‹คํ–‰ํ•  ๋•Œ ์‹คํ–‰๋œ ์‹œ๊ฐ„์„ ์•Œ๋ ค์ค€๋‹ค.

    ์ฃผ๊ด€์ ์œผ๋กœ 0์ดˆ๋ฉด ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ ์ฆ‰์‹œ์‹คํ–‰์ด๋‚˜ ๋‹ค๋ฆ„์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์Œ. ๋ฌผ๋ก , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์•„๋‹ˆ๊ฒ ์ง€๋งŒ

  • ๋™์ผํ•œ ์ง€์—ฐ์‹œ๊ฐ„์„ ๊ฐ–๊ณ ์žˆ๋Š” ๋‘๊ฐœ์˜ setTimeout์„ ํ†ตํ•ด, ๋˜‘๊ฐ™์€ 0์ดˆ๋ฅผ ์ง€์ •ํ–ˆ์„ ๋•Œ, ์‹คํ–‰์‹œ๊ฐ„์˜ ์ฐจ๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•จ.

    ๋งŒ์•ฝ, ๋‘๊ฐœ์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์ •ํ•ด์ง„ ์‹œ๊ฐ„(0์ดˆ) ๋’ค์— ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†๋‹ค๊ณ  ์ƒ๊ฐ๋จ

  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฝํžŒ ์‹œ๊ฐ„๊ณผ ์ฒซ setTimeout์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์ฒซ setTimeout ๋˜ํ•œ, ๋ฐ”๋กœ์‹คํ–‰(0์ดˆ ๋’ค ์‹คํ–‰)์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐ๋จ
  • ๋ฌผ๋ก , ๊ฐœ๋ฐœ์ž์˜ ์ž…์žฅ์—์„œ ๋น„๋™๊ธฐ Api๋Š” ๋ฉ”์ธ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ณ„๋„๋กœ ์‹คํ–‰๋œ ํ›„, ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๋‹ค์Œ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์—์„œ ๋Šฆ๊ฒŒ ํ˜ธ์ถœ๋œ๋‹ค๋Š”๊ฒƒ์€ ๋‹น์—ฐํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ 0์ดˆ๋Š” ์‚ฌ์‹ค ์ฆ‰์‹œ๋ผ๋Š”๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜์˜€์Œ.

๐Ÿš€ ๊ฒฐ๊ณผ

setTimout

๋ชจ๋“  ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด.

์‚ฌ์‹ค ์—ฌ๋Ÿฌ๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจํ•ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์• ์ดˆ์— ์ ˆ๋Œ€ ๋ผ๋Š” ์ˆ˜์‹์–ด๊ฐ€ ๋ถ™์€ ์‹œ์ ์—์„œ ๋‹จ ํ•œ๋ฒˆ์˜ ์˜ˆ์™ธ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋”๋ผ๋„ ๊ทธ ์˜๋ฏธ๋Š” ํ‡ด์ƒ‰๋˜๋Š”๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์—†๋‹ค๊ณ  ๋ณธ๋‹ค.

์ฆ‰, setTimeout์€ ์ง€์ •๋œ ์‹œ๊ฐ„์— ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋ฐ€๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ .

๐Ÿ‘ MDN์˜ ์˜๊ฒฌ

MDN์—์„œ setTimeout๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธ€์ด ์žˆ์—ˆ๋‹ค.

์‹คํ–‰์€ que์— ๋Œ€๊ธฐ์ค‘์ธ ์ž‘์—… ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ง€์—ฐ(delay)์€ ๋ณด์žฅ๋œ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ์‹œ๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ setTimeout์€ setTimeout์— ๋Œ€ํ•œ ํŠน์ • ์‹œ๊ฐ„ ์ œํ•œ์„ ์ง€์ • ํ–ˆ๋”๋ผ๋„ ๋Œ€๊ธฐ์ค‘์ธ ๋ฉ”์‹œ์ง€์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿง‘โ€โš–๏ธ ๊ฒฐ๋ก 

setTimeout์˜ ์ง€์ •๋œ ์‹œ๊ฐ„์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์ง€์—ฐ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ์‹œ๊ฐ„์ด๋ฉฐ, que์— ์ค‘์ฒฉ๋œ ์—ฌ๋Ÿฌ ์ž‘์—…๊ณผ ๊ฐ™์ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋Œ€๊ธฐ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

์•„๋งˆ Promise์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ Api๋“ค๋„ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ์ผ ๊ฒƒ ๊ฐ™๋‹ค.

์ด์ฒ˜๋Ÿผ ์ตœ๋Œ€ํ•œ ์˜ˆ์ƒ๋œ ์‹œ๊ฐ„์— ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก debounce์™€ throttle์„ ํ†ตํ•ด ๋น„๋™๊ธฐํ•จ์ˆ˜๋“ค์ด ์ค‘์ฒฉ๋˜๋Š”๊ฒƒ์„ ์ œ์–ดํ•˜๋Š”๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค.

๋‹ต๋ณ€์€ ์ž˜ ํ•œ๊ฑฐ๊ฒ ์ง€?


@SangMin
๐Ÿ‘† H'e'story

๐Ÿš€GitHub