JS

debounce & throttle

2025. 1. 5. 08:00

어떤 족보 탐색 코드를 분석하다가 'debounce'라는 함수가 등장하길래 검색해봄

const sendSearchTerm = debounce((searchTerm) => {
    if (ws.readyState === WebSocket.OPEN && selectedFile) {
      if (!searchTerm) {
        resultsDiv.innerHTML = INITIAL_SCREEN_HTML;
        return;
      }

      // GA 이벤트 전송 추가
      gtag("event", "search", {
        event_category: "Search",
        event_label: selectedFile,
        search_term: searchTerm,
      });

      ws.send(
        JSON.stringify({
          type: "search",
          query: searchTerm,
          selectedFile: selectedFile,
          delimiter: delimiterSelect.value,
          caseSensitive: caseSensitiveCheckbox.checked,
          ignoreSpaces: ignoreSpacesCheckbox.checked,
        })
      );
    }
}, 300);

 

debounce? 뭐지? 자스 내장 메서드인가? 찾아봤더니 내장 메서드는 아니고, 일종의 '기법'이었다.

 

 


debounce()

JavaScript에서 debounce(디바운스)는 유저가 입력할 때마다 코드를 오직 한 번씩만 실행되도록 해주는 함수입니다.

 

방문자가 타이핑을 끝내고 난 뒤에만 검색 질의(query)에 대한 제안 옵션을 보여주고 싶다고 해봅시다.

아니면 양식의 내용을 저장하고자 하지만, 매번 '저장'이 발생한다면 데이터베이스를 거쳐야 하니, 사용자가 해당 내용을 적극적으로 변경하지 않을 때만 이를 하고 싶다고 해봅시다.

 

debounce는 특별한 함수로, 아래 두 가지 일을 처리합니다.

  • timer 값의 스코프(scope)를 할당하고
  • 함수가 지정된 시간에 작동되도록 스케줄링합니다.

 

위 정보를 기반으로 코드를 보면, sendSearchTerm 함수는 debounce를 적용하여 디바운싱할 기능들을 그 안에서 호출하고 있고, 이 기능들은 sendSearchTerm 함수가 호출되고 300밀리세컨드가 지난 후에야 실행된다. 300밀리세컨드 사이에 일어난 n번의 sendSearchTerm 함수 호출들을 무시하고, 마지막 한 번의 호출만 하는 것이다.

 

시사점

이러한 debounce를 사용하면, 모든 입력에 일일이 대응했을 때 발생하는 과도한 쿼리 비용을 방지하여 앱이 훨씬 효율적으로 작동할 수 있다.

 

 

출처

https://www.freecodecamp.org/korean/news/debounce-dibaunseu-javascripteseo-hamsureul-jiyeonsikineun-bangbeob-js-es6-yeje/

 

Debounce(디바운스) - JavaScript에서 함수를 지연시키는 방법 (JS ES6 예제)

JavaScript에서 debounce(디바운스)는 유저가 입력할 때마다 코드를 오직 한 번씩만 실행되도록 해주는 함수입니다. 검색 박스의 제안, 텍스트 필드의 자동 저장, 버튼의 더블 클릭의 제거가 모두 debou

www.freecodecamp.org

ㄴ 디바운스의 어원에 대해서도 나와있다.

 

 


throttle

https://velog.io/@seoyaon/Javascript-%EB%94%94%EB%B0%94%EC%9A%B4%EC%8B%B1debouncing%EA%B3%BC-%EC%93%B0%EB%A1%9C%ED%8B%80%EB%A7%81throttling

 

[Javascript] 디바운싱(debouncing)과 쓰로틀링(throttling)

뭐야? 뭐야? 서버가 느려졌어..! 😨

velog.io

throttle에 대한 정리는 여기서 디바운싱과 비교하여 매우 잘 정리되어 있다.

간단히 옮겨 적자면...

 

즉 쓰로틀링은 연이어 호출되는 함수들 중에서 첫 번째 함수만을 호출하여 주어진 시간동안 후속 이벤트를 무시하는 것이고,
디바운싱은 연이어 호출되는 함수들 중에서 이전 이벤트를 무시하고 마지막 함수만을 호출하는 것입니다.


쓰로틀링은 스크롤 이벤트에 자주 쓰이고, 디바운싱은 주로 ajax 검색에 자주 쓰인다고 하네요.

 

 

'JS' 카테고리의 다른 글

Three.js + Webpack 프로젝트를 github pages로 배포 후, 이미지 경로 못 찾는 문제  (0) 2025.02.22
한글만 두 번씩 입력되는 문제 (IME Composition)  (0) 2025.02.16
나의 첫 'REST API' 사용  (0) 2024.09.16
리턴값으로 프로미스를 반환하는 함수 사용법  (0) 2024.09.10
[webpack] build:dev와 build:prod의 차이  (0) 2024.09.07
'JS' 카테고리의 다른 글
  • Three.js + Webpack 프로젝트를 github pages로 배포 후, 이미지 경로 못 찾는 문제
  • 한글만 두 번씩 입력되는 문제 (IME Composition)
  • 나의 첫 'REST API' 사용
  • 리턴값으로 프로미스를 반환하는 함수 사용법
쥬피썬더의노예
쥬피썬더의노예
오히려 좋아
  • 쥬피썬더의노예
    d.log
    쥬피썬더의노예
    글쓰기 관리
    • 분류 전체보기 (112)
      • JS (37)
      • TS (3)
      • WEB (10)
      • React.js (20)
      • Next.js (4)
      • tanstack query (2)
      • Node.js (2)
      • HTML (5)
      • CSS (13)
      • CS (1)
      • 에이전트 (1)
      • Git (4)
      • JAVA (0)
      • SQL (0)
      • db (0)
      • GSAP (0)
      • 자료구조 (1)
      • 알고리즘 (0)
      • ✨회고 (5)
      • 포꾸 (0)
      • 인터뷰 (0)
      • 개발일지 (0)
      • 일기 (1)
      • etc (3)
      • 정처기 실기 (0)
        • C (0)
        • Java (0)
        • Python (0)
      • fonts (0)
      • articles (0)
      • 도서 (0)
  • 인기 글

  • 태그

    유효성 검사
    javascript
    클로저
    TypeScript
    WEB
    useEffect
    SSG
    상태 관리
    state
    리액트
    Next.js
    아키텍처
    React
    자바스크립트
    zustand
    Til
    폼
    프론트엔드
    CSR
    HTML
    useState
    안티그래비티
    React.JS
    GIT
    리팩토링
    슬라이딩 윈도우
    React Query
    css
    SSR
    조합 패턴
  • 최근 글

  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
쥬피썬더의노예
debounce & throttle
상단으로

티스토리툴바