자바스크립에서 이벤트 제어하기, 디바운싱과 쓰로틀링
프로젝트를 하다보면 모든 API 요청을 마구잡이로 보내서 과해지는 경우가 있습니다. 사용자에 입력에 대한 요청을 조절하여 수행할 수 있도록 어떻게 해야할까요? 왜 버튼은 여러번 클릭해도 한 번만 입력되는 건지, 검색 결과의 목록 표시는 어떻게 이뤄지는 건지. 프론트엔드 영역에서의 최적화, Debouncing과 Throttiling은 무엇이고 어떨 때 사용해야 하는 것인지 개념을 알아봤습니다.
Debouncing (디바운싱)
Debouncing은 사용자가 어떠한 이벤트를 몇 번이나 발생시키든 이벤트를 실행하지 않고 일정한 시간이 지난 뒤에 실행하도록 하는 방법입니다. 예를 들어 사용자가 '자바스크립트'를 검색하려고 합니다. 여기서 발생하는 이벤트는 '텍스트를 입력'하는 것이고, 입력한 텍스트에 대한 결과를 요청(query)하여 검색창 하단에 보여줄 것입니다. 하지만 입력 패턴을 보자면 'ㅈ > 자 > 자ㅂ > ... > 자바스크립트'의 순서로 API 요청을 하게 될겁니다. 이러한 과정은 모두 비용이 소모되므로 문제가 됩니다. 따라서 디바운싱은 위의 예시와 같이 연이어 발생하는 이벤트를 단일 이벤트로 만들어야 하는 기능(입력 이벤트의 검색 결과 표시, 자동 저장 기능 등)에 주로 사용됩니다.
let timer;
const debounce = (func, delay = 200) => {
return (...args) => {
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(() => {
func(...args);
}, delay);
};
};