Skip to content

Latest commit

ย 

History

History
152 lines (98 loc) ยท 5.98 KB

File metadata and controls

152 lines (98 loc) ยท 5.98 KB

Throttling and Debouncing


scroll, resize, input, mousemove ๊ฐ™์€ ์ด๋ฒคํŠธ๋Š” ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ์— ๋ฐ”์ธ๋”ฉํ•œ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ํ˜ธ์ถœ๋˜์–ด โ—โ—์„ฑ๋Šฅ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ—โ—


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


๐Ÿค” What is Debouncing?


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


debounce

<--> : delaytime


๐Ÿ˜ฎ When we use Debouncing?


  • ๊ฒ€์ƒ‰ ํ•  ๋•Œ

    : input ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ์ž…๋ ฅ ํ•„๋“œ์— ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ ๋งˆ๋‹ค ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์ฐฝ์— ํ•œ๊ธ€์ž ํ•œ๊ธ€์ž ์น ๋•Œ๋งˆ๋‹ค Ajax ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ์™„๋ฃŒํ•˜์ง€ ์•Š์•˜์–ด๋„ Ajax์š”์ฒญ์ด ์ „์†ก๋  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ์„œ๋ฒ„์—๋„ ๋ถ€๋‹ด์„ ์ค„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ—โ—

    ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ ํ•œ๋ฒˆ๋งŒ Ajax ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. => ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ํ…์ŠคํŠธ ์ž…๋ ฅํ•„๋“œ์— ๊ฐ’์„ ์ž…๋ ฅ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž…๋ ฅ์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค!


  • ํ™”๋ฉด resizing ํ•  ๋•Œ

    : debounce๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” resize ์ด๋ฒคํŠธ๋Š” ํ™”๋ฉด์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ณ€๊ฒฐํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ๋กํ•˜์ง€๋งŒ, debounce๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด resize์ด๋ฒคํŠธ์˜ ๋งˆ์ง€๋ง‰์„ ์ถ”์ ํ•ด์„œ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

    $(document).ready(function(){
    
    var $win = $(window);
    var $left_panel = $('.left-panel');
    var $right_panel = $('.right-panel');
    
    function display_info($div) {
      $div.append($win.width() + ' x ' + $win.height() +  '<br>');
    }
                  
    $(window).on('resize', function(){
      display_info($left_panel);
    });
    
    $(window).on('resize', _.debounce(function() {
      display_info($right_panel);
    }, 400));
    });

๐Ÿ“ ์ด์ฒ˜๋Ÿผ ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋‹ค๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ!! ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด debounce ์ž…๋‹ˆ๋‹ค!


๐Ÿค” What is Throttling?


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


throttling


๐Ÿ˜ฎ When we use Throttling?


  • ๋ฌดํ•œ ์Šคํฌ๋กค(Infinite Scrolling)

    : ์‚ฌ์šฉ์ž๊ฐ€ footer ์—์„œ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋งจ ์•„๋ž˜๋กœ ์Šคํฌ๋กค ํ–ˆ๋‹ค๋ฉด Ajax ๋ฅผ ํ†ตํ•ด ๋” ๋งŽ์€ ์ฝ˜ํ…์ธ ๋ฅผ ์š”์ฒญํ•˜์—ฌ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ debouncing ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์„ ๋ฉˆ์ถœ๋•Œ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ, ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด throttling์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

    $(document).ready(function(){
    $(document).on('scroll', _.throttle(function(){
      check_if_needs_more_content();
    }, 300));
    
    function check_if_needs_more_content() {     
      pixelsFromWindowBottomToBottom = 0 + $(document).height() - $(window).scrollTop() -$(window).height();
      
      if (pixelsFromWindowBottomToBottom < 200){
        // Here it would go an ajax request
        $('body').append($('.item').clone()); 
      }
    }
    });

๐Ÿ“ ์œ„์˜ ์˜ˆ์ œ์—์„œ Thtottling ์—†์ด scroll ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ• ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด Throttling ์ž…๋‹ˆ๋‹ค!


๐Ÿค” What is differences between Debounce and Throttle?


์ œ์ผ ํฐ ์ฐจ์ด์ ์€ ์Šค๋กœํ‹€์€ ์ ์–ด๋„ X๋ฐ€๋ฆฌ ์ดˆ๋งˆ๋‹ค ์ •๊ธฐ์ ์œผ๋กœ ๊ธฐ๋Šฅ ์‹คํ–‰์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค! Debounce๋Š” ์•„๋ฌด๋ฆฌ ๋งŽ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ชจ๋‘ ๋ฌด์‹œํ•˜๊ณ  **ํŠน์ • ์‹œ๊ฐ„ ์‚ฌ์ด์— ์–ด๋–ค ์ด๋ฒคํŠธ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•**์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „์— ๊ณ„์† ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฝœ๋ฐฑ์— ๋ฐ˜์‘ํ•˜๋Š” ์ด๋ฒคํŠธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  โ—โ—๊ณ„์† ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹คโ—โ—

var inside1 = $(".inside-1");
var thing1 = $(".thing-1");
var count1 = $(".count-1");
inside1.on('scroll', function() {
  thing1.css("top", inside1[0].scrollTop);
  count1.html(parseInt(count1.html())+1);
});

// 2 
var inside2 = $(".inside-2");
var thing2 = $(".thing-2");
var count2 = $(".count-2");
inside2.on('scroll', _.throttle(function() {
  thing2.css("top", inside2[0].scrollTop); 
  count2.html(parseInt(count2.html())+1);
}, 150));

// 3
var inside3 = $(".inside-3");
var thing3 = $(".thing-3");
var count3 = $(".count-3");
inside3.on('scroll', _.debounce(function() {
  thing3.css("top", inside3[0].scrollTop);
  count3.html(parseInt(count3.html())+1);
}, 100));

https://lodash.com/docs/4.17.15#throttle

https://underscorejs.org/#throttle

https://webclub.tistory.com/607