Throttle & Debounce๐Ÿ’ก

ladash์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ค‘ ์ œ๋ฒ• ์œ ์šฉํ•˜๊ฒŒ, ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ๊ฐ™์€ Throttle๊ณผ Debounce์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

๋‘๊ฐœ์˜ ํ•จ์ˆ˜ ๋ชจ๋‘ ์ผ์ •์‹œ๊ฐ„๊ฐ„๊ฒฉ ๋‚ด์— ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ชฉ์ ์€ ๊ฐ™์œผ๋‚˜
์‹คํ–‰์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ฐจ์ด๊ฐ€ ๋‚˜ํƒ€๋‚จ

๐ŸงกThrottle

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

๐Ÿ’›๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

  1. $ npm i lodash ์„ค์น˜!
  2. import throttle from "lodash/throttle";
  3. addEventListener์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ž๋ฆฌ์— throttle(์ฝœ๋ฐฑ, ์‹œ๊ฐ„)์„ ๋„ฃ๋Š”๋‹ค

๐Ÿ’›throttle ๋ฏธ์ ์šฉ

  window.addEventListener('scroll',() => {
    console.log('scroll');
  })
  • ์œ„์™€๊ฐ™์ด ์Šคํฌ๋กค์ด๋ฒคํŠธ๋ฅผ ์ž‘๋™์‹œํ‚ค๊ณ  ์Šคํฌ๋กค์„ ์ญ‰ ๊ตด๋ ค๋ณด๋ฉด
    ์•„๋ž˜์ฒ˜๋Ÿผ ๋„ˆ๋ฌด ๋งŽ์€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ๋ฐœ์ƒ

๐Ÿ’›throttle ์ ์šฉ

  import throttle from "lodash/throttle";

  window.addEventListener('scroll', throttle(() => {
    console.log('scroll')
  }, 500))
  • 500ms๋กœ ์‹œ๊ฐ„์„ค์ •์„ ํ•ด์ฃผ์–ด 0.5์ดˆ๊ฐ„๊ฒฉ์œผ๋กœ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰ ๋จ

ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋นˆ๋„๊ฐ€ ํ™•์—ฐํžˆ ์ค„์–ด๋“ค์—ˆ๋‹ค!


๐ŸงกDebounce

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

๐Ÿ’›๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

  1. $ npm i lodash ์„ค์น˜!
  2. import debounce from "lodash/debounce";
  3. addEventListener์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ž๋ฆฌ์— debounce(์ฝœ๋ฐฑ, ์‹œ๊ฐ„)์„ ๋„ฃ๋Š”๋‹ค

๐Ÿ’›debounce ๋ฏธ์ ์šฉ

  const inputEl = document.querySelector('input')

  inputEl.addEventListener('input', () => {
    console.log(inputEl.value);
  })
  • ์ธํ’‹์— ์ƒˆ๋กœ์šด ๋ฌธ์ž๊ฐ€ ํƒ€์ดํ•‘ ๋  ๋•Œ ๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋จ

๐Ÿ’›debounce ์ ์šฉ

  const inputEl = document.querySelector('input')
  
  inputEl.addEventListener('input', debounce(() => {
    console.log(inputEl.value);
  }, 300))
  • 300ms๋กœ ์‹œ๊ฐ„์„ค์ •์„ ํ•ด์ฃผ์–ด 0.3์ดˆ๊ฐ„ ์žฌ ์ž…๋ ฅ์ด ์—†์„ ์‹œ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰ ๋จ

๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰์ฐฝ์˜ ๊ฒฝ์šฐ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์œ„์™€๊ฐ™์€ ๊ฒฝ์šฐ์— debounce๋ฅผ ๊ฑธ์–ด ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ํ˜ธ์ถœ ๋นˆ๋„๋ฅผ ๋‚ฎ์ถฐ์ฃผ๋ฉด ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์ผ๊ธฐ ๐Ÿ’ญ

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