๐Ÿ“‹ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive | 41์žฅ ํƒ€์ด๋จธ

waterglassesยท2022๋…„ 7์›” 13์ผ
0
post-thumbnail

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ๋„์„œ์˜ 41์žฅ ํƒ€์ด๋จธ๋ฅผ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

41.1 ํ˜ธ์ถœ ์Šค์ผ€์ค„๋ง

ํ•จ์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋„๋ก ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ํƒ€์ด๋จธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ˜ธ์ถœ ์Šค์ผ€์ค„๋ง์ด๋ผ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ด๋จธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ด๋จธ ํ•จ์ˆ˜ setTImeout๊ณผ setInterval, ํƒ€์ด๋จธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ด๋จธ ํ•จ์ˆ˜ clearTimeout๊ณผ clearInterval์„ ์ œ๊ณตํ•œ๋‹ค.

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

41.2 ํƒ€์ด๋จธ ํ•จ์ˆ˜

41.2.1 setTimeout/clearTimeout

setTimeoutํ•จ์ˆ˜๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์‹œ๊ฐ„์œผ๋กœ ๋‹จ ํ•œ ๋ฒˆ ๋™์ž‘ํ•˜๋Š” ํƒ€์ด๋จธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ฆ‰, setTimeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์‹œ๊ฐ„ ์ดํ›„ ๋‹จ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋„๋ก ํ˜ธ์ถœ ์Šค์ผ€์ค„๋ง๋œ๋‹ค.

// setTimeout ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๋œ ํƒ€์ด๋จธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ ํƒ€์ด๋จธ id๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const timerId = setTimeout(() => console.log('Hi!'), 1000);

// ํƒ€์ด๋จธ id๋ฅผ clearTimeout ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ใ…“ใ…ˆใ„ด๋‹ฌํ•˜์—ฌ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•œ๋‹ค.
clearTimeout(timerId)

41.2.2 setInterval/clearInterval

`setInterval ํ•จ์ˆ˜๋Š” ๋‘ ๋ฒˆ์จฐ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜๋ณต ๋™์ž‘ํ•˜๋Š” ํƒ€์ด๋จธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋Š” ํƒ€์ด๋จธ๊ฐ€ ์ทจ์†Œ๋ ๋•Œ๊นŒ์ง€ ๊ณ„์†๋œ๋‹ค!

let count = 1

const timeoutId = sestInterval(() => {
  console.log(count) // 1 2 3 4 5
  
  // count๊ฐ€ 5์ด๋ฉด ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•œ๋‹ค.
  if(count++ === 5) clearInterval(timeoutId)
}, 1000)

41.3 ๋””๋ฐ”์šด์Šค์™€ ์Šค๋กœํ‹€

๋””๋ฐ”์šด์Šค์™€ ์Šค๋กœํ‹€์€ ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ ๊ณผ๋„ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.

41.3.1 ๋””๋ฐ”์šด์Šค

๋””๋ฐ”์šด์Šค๋Š” ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•œ๋‹ค.

const $input = document.querySelector('input')
const $msg = document.querySelector('.msg')

const debounce = (callback, delay) => {
  let timerId
  
  // debounce ํ•จ์ˆ˜๋Š” timerId๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  return event => {
    // delay๊ฐ€ ๊ฒฝ๊ณผํ•˜๊ธฐ ์ด์ „์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด์ „ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•˜๊ณ  ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•œ๋‹ค.
    if (timerId) clearTimeout(timerId)
    timerId = setTimeout(callback, delay, event)
  }
}

// debounce ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ €๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋ก๋œ๋‹ค.
// 300ms ๋™์•ˆ input ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
$input.oninput = debounce(e => {
  $msg.textContent = e.target.value
}, 300)

41.3.2 ์Šค๋กœํ‹€

์Šค๋กœํ‹€์€ ์งค์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ ์ผ์ • ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ˜ธ์ถœ ์ฃผ๊ธฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

const throttle = (callback, delay) => {
  let timerId
  
  // throttle ํ•จ์ˆ˜๋Š” timerId๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  return event => {
    // delay๊ฐ€ ๊ฒฝ๊ณผํ•˜๊ธฐ ์ด์ „์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋‹ค๊ฐ€ delay๊ฐ€ ๊ฒฝ๊ณผํ–ˆ์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•œ๋‹ค.
    // ๋”ฐ๋ผ์„œ delay ๊ฐ„๊ฒฉ์œผ๋กœ callback์ด ํ˜ธ์ถœ๋œ๋‹ค.
    if(timerId) return
    timerId = setTimeout(() => {
      callback(event)
      timerId = null
    }, delay, event)
  }
}

์ด๋Ÿฐ ์Šค๋กœํ‹€์€ ๋ฌดํ•œ ์Šคํฌ๋กค UI ๊ตฌํ˜„ ๋˜๋Š” scroll ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

Ref

profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€