1 분 소요

스로틀과 디바운싱

  • my real hotel 사이드 프로젝트 중 스로틀과 디바운싱에 대해서 공부하게 되었다. 스로틀과 디바운싱은 둘다 Javascript에서 양이 많은 이벤트를 제어하는 방법이다.
  • 스크롤링과 같은 이벤트는 호출이 매우 많다. 한번 휠을 돌리는 것만으로도 20번 이상의 이벤트가 호출 될 수 있다.
  • 이벤트 핸들러 내부의 기능이 중복적으로, 여러번 호출 될 수가 있다.
  • 유료 API를 사용할 경우, 이런 많은 호출은 많은 비용으로 이어질 수 있다.

스로틀 (Throttle)

  • 이벤트를 일정한 주기마다 발생하여 실행 횟수를 제어한다. -> 정기적인 호출이 보장된다.
  • 스로틀을 영어로 검색 해 보면 밸브의 한 종류가 나온다.
    • 밸브처럼 잠금으로서 함수가 재호출 되지 않도록 제어한다.
  • 이벤트의 성능 문제에서 많이 사용한다.
  • 스크롤링의 예시가 대표적이다.

  • sample code

    js코드

    function throttle(fn, delay) {
      let timer;
      return function() {
          if (!timer){ //타이머가 없다면 셋팅
              timer = setTimeout(() => {
                  timer = null //타이머 초기화
                  fn.apply(this, arguments) //일정 시간 이후에 호출
              }, delay)
          }
      }}
    

디바운스 (Debounce)

  • 특정 시간 이후, 맨 마지막 이벤트(혹은 맨 처음)만 호출
  • 자동완성의 예시가 대표적이다.
    • 사용자가 입력하는 정보를 저장할 때, 모든 key stroke를 저장하게 되면 하나를 입력 할 때마다 핸들러가 호출이 된다.
    • ex)ㄱ 거 검 검ㅅ 검새 검색
    • 따라서 key down 이벤트가 생기고 몇 초 이후에 저장하는 함수를 호출하면 횟수가 크게 줄어들 것이다.
  • sample code

    리액트 코드

      const [debouncedValue, setDebouncedValue] = useState(value);
    
      useEffect(() => {
        // delay 이후에 value 업데이트
        const handler = setTimeout(() => {
          setDebouncedValue(value);
        }, delay);
    
        // 값이 바뀌면 타임아웃 재설정
        return () => {
          clearTimeout(handler);
        };
      },[value, delay] // value나 delay가 변경 되는 경우에만 호출
      );
    

    js 코드

    function debounce(fn, delay) {
      let timer;
      return function() {
          clearTimeout(timer); //호출 될때마다 타이머 초기화
          timer = setTimeout(() => {
              fn.apply(this, arguments); //일정 시간 이후 호출
          }, delay);
      }
    }
    

카테고리:

업데이트: