settimeout vs setinterval - Lee-hyuna/33-js-concepts-kr GitHub Wiki

setTimeout VS setInterval

์›๋ฌธ: setTimeout VS setInterval

๊ฐœ์š”

์šฐ์„  ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์˜๊ฒฌ์ด ๋ถ„๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๋ž˜๋„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๊ฒƒ๋“ค์€ ๊ฝค ๋งŽ์€ ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค. ์ด ๋ฌธ์„œ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์€ ๋‚ด ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค.

๋˜ํ•œ ์ด ๋ฌธ์„œ๊ฐ€ window.requestAnitaionFrame()์™€ ์—ฐ๊ด€๋˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผํ•œ๋‹ค. setTimeout์ด๋‚˜ setInterval ๋Œ€์‹  window.requestAnitaionFrame์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋„, ๊ทธ๊ฒƒ์€ DOM ๋ฆฌํŽ˜์ธํŠธ์™€ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด์ƒ์ ์œผ๋กœ๋Š” ์ดˆ๋‹น 60ํšŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ์–ด๊ฐ€ ์–ด๋ ต๋‹ค.

window.onload

๋ฉฐ์น  ์ „ ๋‚ด ์นœ๊ตฌ๊ฐ€ ๋‚˜์—๊ฒŒ ๋ฌผ์—ˆ๋‹ค.

ํƒ€์ด๋จธ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

์†”์งํžˆ ๋งํ•˜๋ฉด ๋‚˜๋Š” ๊ทธ ๊ณ ํ†ต์„ ์ฆ‰์‹œ ๋– ์˜ฌ๋ ธ๋‹ค... ์ด ์—…๊ณ„์—์„œ ์ผํ•  ๋™์•ˆ, ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์„ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜๊ณผ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์–ด๋ฆฌ๊ณ  ์–ด๋ฆฌ์„์—ˆ๋˜ ๋•Œ์—, ๋‚ด๊ฐ€ ์‹ซ์–ดํ•˜๋Š” ํ•œ ๋‚จ์ž๊ฐ€ ๋‚˜์—๊ฒŒ ์ด๋ ‡๊ฒŒ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜์ง€ ๋งˆ. ๋Œ€์‹  ์–ด๋–ค ๋ณ€ํ™”๊ฐ€์žˆ์„ ๋•Œ ๋งํ•˜๊ณ  ๋ฐ˜์‘ํ•ด์•ผํ•˜๋Š”์ง€ ๋“ค์–ด์•ผํ•ด (listen)

๋‚˜๋Š” ์•Œ๊ฒ ์Šต๋‹ˆ๋‹คํ•˜๊ณ  ๊ทธ ๋ฐฉ์„ ๋– ๋‚ฌ๋‹ค. ๊ทธ๊ฐ€ ๋งํ•œ ๊ฒƒ์„ ์ฆ‰์‹œ ์žŠ์–ด ๋ฒ„๋ ธ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ ๋‚จ์ž๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ...

ํƒ€์ด๋จธ๋Š” ๋‚˜์˜์ง€ ์•Š๋‹ค

๋‚˜๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ํƒ€์ด๋จธ ์—†์ด ์‹œ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ํƒ€์ด๋จธ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฌผ๊ฑด๋“ค ์ฒ˜๋Ÿผ ๋‚จ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์–ด๋–ค ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๋ณผ๋•Œ, ์–ด๋–ค ํ”„๋กœ๊ทธ๋งน ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์ด๋‚˜ ์ œํ•œ์‚ฌํ•ญ์„ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‹คํ–‰์ธ ์ ์€ 99% ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋ฏธ ํƒ€์ด๋จธ ๋ณด๋‹ค ๋” ์ข‹์€ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ๋“ค์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.

window.onload = () => {  
  // see, here you waited for signal from the browser  
};

setInterval

interval์€ ์˜ˆ์ „์— ๋‚ด๊ฐ€ ๋งŽ์ด ์“ฐ๋˜ ๊ฒƒ์ด์—ˆ๋‹ค. ์ •๊ธฐ์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•ด์•ผํ•  ๋•Œ ๋งˆ๋‹ค setInterval()์„ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ๋‹ค. ์ž˜ ๋™์ž‘ํ–ˆ์—ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€์˜ฅ์œผ๋กœ ๋ณ€ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š”...

๋ช‡๋ช‡ ์‚ฌ์‹ค๋“ค

์ผ๋‹จ interval์„ ์„ค์ •ํ•˜๋ฉด, interval์„ ์ง€์šฐ๊ฑฐ๋‚˜ ํ˜„์žฌ ์„ธ์…˜์ด ๋๋‚ ๋•Œ๊นŒ์ง€ interval์€ ๊ณ„์† ํ”„๋กœ์„ธ์Šค๋กœ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค.

setInterval์€ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์ฝœ ์Šคํƒ์— ์ „๋‹ฌ๋  ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค. ์ด๋Š” ๊ฐ interval ์‚ฌ์ด์˜ ์‹œ๊ฐ„์ด ํ•ญ์ƒ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. *

์ž ๊น, ๊ทธ๊ฑด ๋‚ด ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๋œป์ธ๊ฐ€?

์•„๋‹ˆ. setInterval API๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์— ์ œ๊ณตํ•  ๊ฒƒ์ด๋‹ค. ํ•จ์ˆ˜์˜ ์‹คํ–‰์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์š”์ธ์— ๋‹ฌ๋ ค ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Javascript ์•ฑ์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ž‘๋™ํ•œ๋‹ค. ์ด๋Š” setInterval์˜ ์ง€์—ฐ์ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.(๋˜๋Š” ๋‹จ์ง€ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋‹ค). ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๋ช‡๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜์˜ ํ•˜๋“œ์›จ์–ด ์ œํ•œ
  2. ์•ฑ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋น„ํ™œ์„ฑ ํƒญ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๋ฐฉ์น˜
  3. ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค

์–ธ๊ธ‰๋œ ๋ชจ๋“  ๊ฒƒ์€ ์•„๋ž˜ ์ด๋ฏธ์ง€์— ์„ค๋ช…๋œ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

**dummyMethod1()**์˜ ์‹คํ–‰์€ ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์ธํ•ด ์˜ˆ์ƒ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. Javascript ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ฝœ์Šคํƒ์— ๊ฑธ๋ ธ๋‹ค(got stuck). ์ฆ‰, ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋“ค์€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ์ด๋‹ค...

๋‚ด๊ฐ€ ๋งํ–ˆ๋˜ ๊ฑฐ ๊ธฐ์–ต๋‚˜? "์ง€์˜ฅ์œผ๋กœ ๋ณ€ํ•  ๋•Œ๊นŒ์ง€ ์ž˜ ๋๋‹ค"๊ณ  ๋งํ–ˆ๋‹ค.

์ด์ œ clockTimer ๋ฉ”์†Œ๋“œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” interval ์ƒ์—์„œ 3๋ฒˆ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค. (๋” ๋งŽ์ด ์‹คํ–‰๋ ์ง€๋„). ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒ๋˜๋Š” ์ด์œ ๋Š” ํƒ€์ด๋จธ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ๋˜ํ•œ setInterval์€ ์ฝœ ์Šคํƒ์— ๋ฌด์—‡์„ ์ „๋‹ฌํ•˜๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. setInterval์€ ์ •ํ•ด์ง„ ์ˆœ๊ฐ„์— ์ฝœ์Šคํƒ์— ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ๋์ด๋‹ค.

์ด์ƒ์ ์ธ ํ™˜๊ฒฝ์—์„œ setInterval์€ ๊ฝค ๋ฉ‹์ง€๊ฒŒ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์™€ Javascript๋ฅผ ์—ผ๋‘ํ•œ๋‹ค๋ฉด ๋ณ„๋กœ ๋ฉ‹์ง€์ง€ ์•Š๋‹ค.

* ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์„œ ๋ฌด์—‡์„ ์˜๋ฏธํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค, (setInterval์€ ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์ฝœ์Šคํƒ์— ์ „๋‹ฌ๋จ์„ ๋ณด์žฅํ•œ๋‹ค). ์‹ค์ œ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์€ setInterval๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋‹ค.

setTimeout

์žฌ๊ท€(recursion)์˜ ๋‚ด์šฉ๊ณผ Javascript์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅผ ๊ฒฝ์šฐ, ์ง€๊ธˆ์ด ์•Œ์•„๋ณด๊ธฐ์— ์™„๋ฒฝํ•œ ์‹œ๊ฐ„์ด๋‹ค: ์žฌ๊ท€๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

** setTimeout๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ setInterval์„ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค **

setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋‹ค๋ฅธ ์‹œ๊ฐ„์œผ๋กœ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? setInterval๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์žฌ๊ท€ setTimeout์„ ์‚ฌ์šฉํ•˜๋ผ. ์ •ํ™•ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์—ฌ์ „ํžˆ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.(๋‚ด๊ฐ€ setInterval์— ๋Œ€ํ•ด ๊ธ€์„ ์“ธ๋•Œ ์ง€์ ํ–ˆ๋˜๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋กœ). ๊ทธ๋Ÿฌ๋‚˜ ์ฝœ์Šคํƒ์—์„œ ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์˜ค๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ ˆ๋Œ€๋กœ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

setTimeout๊ณผ ํ•จ๊ป˜ ์žฌ๊ท€ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋ฉด, ๋” ์ข‹์€ setInterval์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ clockTimer()๋ฅผ ์ฝœ ์Šคํƒ์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฐ์ •์€ setTimeout์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. (setInterval์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ). ๋Œ€์‹ ์ •๋ฐ˜๋Œ€๋‹ค. ์žฌ๊ท€ setTimeout์„ ๊ตฌํ˜„ํ•œ clockTimer ์ž์ฒด๋Š” ๋‹ค์Œ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๋‹ด๋‹นํ•œ๋‹ค. setTimeout์€ ๋‹จ์ง€ ๋‹ค์Œ ์‹คํ–‰์„ ์ง€์—ฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๊ฒฉ(interval)์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ํ˜ธ์ถœ ๋˜๋Š” ๋” ์ž˜ ๋งํ•˜์ž๋ฉด, ์ฝœ์Šคํƒ์˜ ๋‹ค์Œ ์‹คํ–‰ํ•  ๋ฉ”์„œ๋“œ๋Š” ํ˜„์žฌ ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ํ›„์— ์ •ํ™•ํžˆ 1000ms (์ด ์˜ˆ์—์„œ) ์ˆ˜ํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•œ๋‹ค.

์žฌ๊ท€ setTimeout์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์™„์ „ํžˆ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€, ๋‹ค๋ฅธ ์‹คํ–‰์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

setInterval์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ถ„๋ช…ํžˆ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ณ  ์•„๋งˆ๋„ ์ผ์–ด๋‚  ๊ฒƒ์ด๋‹ค.

๊ฒฐ๋ก 

๋์œผ๋กœ ๋‚˜๋Š” ์ด ๊ธ€์ด setInterval์ด ๊ถ๊ทน์ ์œผ๋กœ ๋‚˜์œ ์„ ํƒ์ด๋ž€ ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ์—ˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ setInterval์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด๊ฒƒ์€ ํ–ฅํ›„ ๋””๋ฒ„๊น…๊ณผ ์ „๋ฐ˜์ ์ธ ์˜์‚ฌ๊ฒฐ์ •์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ