프론트엔드 개발에서는 스크롤, 입력, 리사이즈 같은 이벤트가 짧은 시간 동안 반복적으로 발생하는 일이 많다. 이런 이벤트에 매번 함수를 실행하면 불필요한 연산으로 성능 저하가 발생할 수 있다.
이를 해결하는 대표적인 기법이 바로 debounce와 throttle이다.
둘 다 함수 호출 빈도를 제어하는 기술이며, 사용 목적과 작동 방식에 차이가 있다.
debounce 함수는 두 가지 인자를 받는다.
// debounce 구현 예시 (화살표 함수 버전)
const debounce = (func, delay) => {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => func(...args), delay);
};
};
throttle 함수도 func과 delay 두 인자를 받고, 다음과 같이 구현할 수 있다.
// throttle 구현 예시
const throttle = (func, delay) => {
let lastCall = 0;
return (...args) => {
const now = new Date().getTime();
if (now - lastCall >= delay) {
lastCall = now;
func(...args);
}
};
};
항목 | debounce | throttle |
---|---|---|
실행 조건 | 마지막 이벤트 이후 일정 시간 무동작 시 실행 | 일정 시간 간격마다 실행 |
주 용도 | 입력 감지 후 서버 요청, resize 이벤트 등 | 스크롤, 클릭 등 고빈도 이벤트 주기 제한 |
특징 | 마지막 이벤트만 반영됨 | 연속 중 일부 이벤트만 반영됨 |
debounce와 throttle은 모두 반복되는 함수 호출을 제어해서 성능을 최적화하고, 불필요한 실행을 방지하는 데 유용한 기법이다.
상황에 맞는 기술을 골라서 쓰면 훨씬 효율적인 웹 애플리케이션을 만들 수 있다.