๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ–ฅ dev-ruby

๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง

ruby_s 2022. 6. 1. 23:18
728x90
๋ฐ˜์‘ํ˜•
SMALL
์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š” ! ๐Ÿ˜„๐Ÿ˜Š

 

๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง์€ ๋””๋ฐ”์ด์Šค์— ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค. ์ผ์ข…์˜ ์ตœ์ ํ™”๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ์˜๋ฏธ๋ฅผ ์•Œ์•„๋ณด์ž.

  • ๋””๋ฐ”์šด์‹ฑ(debouncing) : ์—ฐ์ด์–ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฃผ๋กœ, ๊ทธ๋ฃน์—์„œ ์ฒ˜์Œ์ด๋‚˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์“ฐ๋กœํ‹€๋ง(throttling) : ์—ฐ์ด์–ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด, ์ผ์ •ํ•œ delay๋ฅผ ํฌํ•จ์‹œ์ผœ ์—ฐ์†์ ์œผ๋กœ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ์‹์„ ๋œปํ•œ๋‹ค. ์ฆ‰, delay์‹œ๊ฐ„๋™์•ˆ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๋””๋ฐ”์šด์‹ฑ

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค. ์‹๋‹น์—์„œ ์ฃผ๋ฌธ์„ ํ•  ๋•Œ,

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

1. ๊ณ ๊ฐ: ์ฝœ๋ผ ์ฃผ๋ฌธ์ด์š”!
2. ์ง์›: ์ฝœ๋ผ ์ฃผ๋ฌธ๋„ฃ๊ธฐ
3. ๊ณ ๊ฐ: ํŒŒ์Šคํƒ€ ์ฃผ๋ฌธ์ด์š”!
4. ์ง์›: ํŒŒ์Šคํƒ€ ์ฃผ๋ฌธ๋„ฃ๊ธฐ
5. ๊ณ ๊ฐ: ์Šคํ…Œ์ดํฌ ์ฃผ๋ฌธ์ด์š”!
6. ์ง์›: ์Šคํ…Œ์ดํฌ ์ฃผ๋ฌธ๋„ฃ๊ธฐ

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•

1. ๊ณ ๊ฐ: ์ฝœ๋ผ, ํŒŒ์Šคํƒ€, ์Šคํ…Œ์ดํฌ ์ฃผ๋ฌธ์ด์š”!
2. ์ง์›: ์ฝœ๋ผ, ํŒŒ์Šคํƒ€, ์Šคํ…Œ์ดํฌ ์ฃผ๋ฌธ๋„ฃ๊ธฐ


๋‹น์—ฐํžˆ ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ฃผ๋ฌธ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋“ฃ๊ณ  ์žˆ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ์š”์ฒญ์ด ์™„๋ฃŒ๋œ ํ›„ ์ฃผ๋ฌธ์„ ๋„ฃ๋Š” ๊ฒƒ์ด ๋””๋ฐ”์šด์‹ฑ์˜ ์›๋ฆฌ์ด๋‹ค.

 

๋””๋ฐ”์šด์‹ฑ ์‚ฌ์šฉ์˜ˆ์‹œ

์Šคํฌ๋กค ์ด๋ฒคํŠธ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค. ๋จผ์ € ๋””๋ฐ”์šด์‹ฑ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

๋””๋ฐ”์šด์‹ฑ ์ ์šฉ X ์ฝ”๋“œ

<!DOCTYPE html>
<html>
  <body>
    <div id="main" style="height: 300vh">
      <div style="position: fixed">
        <h3>์•„๋ฌด ์ฒ˜๋ฆฌ๋„ ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ</h3>
        <div>
          <label>์ด๋ฒคํŠธ ๋ฐœ์ƒ : </label>
          <span id="count">0</span>
        </div>
      </div>
    </div>
  </body>
  <script>
    window.addEventListener("scroll", function (e) {
      console.log("์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋ฐœ์ƒ");
      const count = document.getElementById("count");
      count.innerText = parseInt(count.innerText) + 1;
    });
  </script>
</html>

์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ˆœ๊ฐ„๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  count๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์ด ํ•จ์ˆ˜๊ฐ€ ์ข€ ๋” ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์Šคํฌ๋กค์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง์ด ๋˜๊ณ  ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋””๋ฐ”์šด์‹ฑ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

๋””๋ฐ”์šด์‹ฑ ์ ์šฉ O ์ฝ”๋“œ

<!DOCTYPE html>
<html>
  <body>
    <div id="main" style="height: 300vh">
      <div style="position: fixed">
        <h3>Debouncing ์ ์šฉ</h3>
        <div>
          <label>์ด๋ฒคํŠธ ๋ฐœ์ƒ : </label>
          <span id="count">0</span>
        </div>
      </div>
    </div>
  </body>
  <script>
    let debouncer;
    window.addEventListener("scroll", function (e) {
      if (debouncer) {
        clearTimeout(debouncer);
      }

      debouncer = setTimeout(function () {
        console.log("์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋ฐœ์ƒ");
        const count = document.getElementById("count");
        count.innerText = parseInt(count.innerText) + 1;
      }, 300);
    });
  </script>
</html>

debouncer๋ผ๋Š” ๋ณ€์ˆ˜์— delay 300ms๋ฅผ ๊ฑธ์–ด์ค€ setTimeout ํ•จ์ˆ˜๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ํด๋กœ์ € ๊ฐœ๋…์ด ์“ฐ์˜€๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ๋ฐœ์ƒํ•œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ์ด์ „์— ๋ฐœ์ƒํ•œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ณด๋‹ค 300ms๋‚ด์—(๋ณด๋‹ค ๋นจ๋ฆฌ) ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, ์ด์ „ ์ด๋ฒคํŠธ์— ๊ธฐ๋ก๋œ setTimeout์ด ๋Œ€์ž…๋œ debouncer์— ๋‹ค์‹œ ์ƒˆ๋กœ์šด setTimeout์„ ๋Œ€์ž…์‹œํ‚จ๋‹ค. ์ด๋•Œ debouncer์— ๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค๋ฉด clearTimeout์œผ๋กœ ํ•ด๋‹น ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์ด์ „ ํƒ€์ด๋จธ๊ฐ€ ์ง€์›Œ์ง€๊ณ  ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๊ฐ€ ๋Œ€์ž…๋œ๋‹ค. 
๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด์„œ๋งŒ 300ms๊ฐ€ ์ง€๋‚œ ํ›„ setTimeout์•ˆ์˜ ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜์–ด ์นด์šดํŠธ๊ฐ€ ์ ์ ˆํžˆ ๋ณ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์“ฐ๋กœํ‹€๋ง

์“ฐ๋กœํ‹€๋ง์€ ๋ณดํ†ต ์„ฑ๋Šฅ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์“ฐ๋กœํ‹€๋ง์€ ์‹คํ–‰ ํšŸ์ˆ˜์— ์ œํ•œ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ๋ช‡ ์ดˆ์— ํ•œ ๋ฒˆ ๋˜๋Š” ๋ช‡ ๋ฐ€๋ฆฌ์ดˆ์— ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

์“ฐ๋กœํ‹€๋ง ์ ์šฉ O ์ฝ”๋“œ

<!DOCTYPE html>
<html>
  <body>
    <div id="main" style="height: 300vh">
      <div style="position: fixed">
        <h3>Throttling ์ ์šฉ</h3>
        <div>
          <label>์ด๋ฒคํŠธ ๋ฐœ์ƒ : </label>
          <span id="count">0</span>
        </div>
      </div>
    </div>
  </body>
  <script>
    let throttler;
    window.addEventListener("scroll", function (e) {
      if (throttler) {
        return;
      }
      throttler = setTimeout(function () {
        console.log("์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋ฐœ์ƒ");
        const count = document.getElementById("count");
        count.innerText = parseInt(count.innerText) + 1;
        throttler = null;
      }, 200);
    });
  </script>
</html>

์‹คํ–‰ ๊ฒฐ๊ณผ, ์Šคํฌ๋กค์„ ์ฒœ์ฒœํžˆ ์›€์ง์—ฌ๋„, ์—„์ฒญ ๋น ๋ฅด๊ฒŒ ์›€์ง์—ฌ๋„ ์ผ์ •ํ•˜๊ฒŒ count๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋””๋ฐ”์šด์Šค์™€ ๋‹ค๋ฅธ ์ ์€ throttler์— ํƒ€์ด๋จธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ clearTimeout์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ return์œผ๋กœ ๊ทธ๋ƒฅ ์ข…๋ฃŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ด์ „์— ๋Œ€์ž…๋˜์—ˆ๋˜ ํƒ€์ด๋จธ๊ฐ€ ์ทจ์†Œ๋˜์ง€ ์•Š๊ณ , ํƒ€์ด๋จธ๊ฐ€ ์„ค์ •์ด ๋œ ์ดํ›„๋กœ๋ถ€ํ„ฐ 300ms๋‚ด์— ์‹คํ–‰๋˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. throttler์— ํƒ€์ด๋จธ๊ฐ€ ์„ค์ •๋˜๊ณ  ๋‚œ ํ›„ 300ms๋™์•ˆ์€ throttler๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ฅ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ์ฅ๊ณ  ์žˆ๋Š” 300ms๋™์•ˆ 1๋ฒˆ์˜ ์ด๋ฒคํŠธ๋งŒ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
๋˜ํ•œ, ๋กœ์ง์ด ์‹คํ–‰๋˜๊ณ  ๋‚œ ํ›„ throttler๋ฅผ null๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋ฉด์„œ throttler์— ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ ์•Œ๋ ค์ฃผ์–ด์•ผ ๋‹ค์Œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ return ๋˜์ง€ ์•Š๊ณ  setTimeout์„ ๋‹ค์‹œ ๊ฑธ์–ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ฝ˜์†”๋กœ ํ™•์ธํ•ด๋ณด๋‹ˆ setTimeout์ด ์–‘์˜ ์ •์ˆ˜๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, 300msํ›„ ๋กœ์ง์ด ์ „๋ถ€ ๋๋‚˜๊ณ  ๋‚˜์„œ๋Š” 1์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” clearTimeout์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์ดˆ๊ธฐํ™”์‹œ์ผœ์ฃผ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ null๋กœ ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋ ˆํผ๋Ÿฐ์Šค

https://developer.mozilla.org/ko/docs/Web/API/setTimeout

https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout

https://velog.io/@yujuck/Javascript-%EB%94%94%EB%B0%94%EC%9A%B4%EC%8A%A4%EC%99%80-%EC%93%B0%EB%A1%9C%ED%8B%80%EB%A7%81

https://programming119.tistory.com/241

 

728x90
๋ฐ˜์‘ํ˜•
LIST