Debounce 와 throttle은 무수히 많은 이벤트로 인해 CPU에 무리가 가는 상황이 발생했을 때, 성능 최적화를 위해 사용되는 프로그래밍 기법이다.
두 기법 모두 “연속적으로 발생하는 이벤트의 실행 빈도를 줄여 불필요한 함수 호출과 리소스 소모를 방지해주는 기법” 으로 동일한 목적을 가지고 있다.
하지만, 최적화를 처리하는 방식에서 차이를 보인다. 각각 어떻게 다른지, 그리고 어떻게 구현할 수 있는지 알아보자.
“연속적으로 발생하는 이벤트를 하나의 그룹으로 묶어 처리하는 방식”
마지막 이벤트가 발생한 후 일정 시간이 경과했을 때만 함수를 실행하는 기법이다.
주요 특징
사용 예시
*“일정한 시간 간격만 함수를 실행하는 방식”*
이벤트가 연속적으로 발생하더라도, 설정된 주기마다 한 번씩만 함수가 실행되도록 한여, 일정한 간격의 처리를 보장한다.
주요 특징
사용 예시

구현 인사이트
구현 포인트
clearTimeout으로 기존 타이머를 취소this 컨텍스트를 유지구현 코드
function debounce(func: (...args: any[]) => void, delay: number) {
// 클로저로 타이머 변수 저장
let timeout: NodeJS.Timeout;
// 인자를 받아서 타이머 설정
return function (...args: any[]) {
clearTimeout(timeout);
// 타이머 설정
timeout = setTimeout(() => func.apply(this, args), delay);
};
}
구현 인사이트
구현 포인트
구현 코드
function throttle(func: (...args: any[]) => void, limit: number) {
let inThrottle = false;
return (...args: any[]) => {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => (inThrottle = false), limit);
}
};
}
이를 제공하는 주요 라이브러리는 많지만, 대표적인 두가지 lodash와 es-toolkit에 대한 비교이다.
| 항목 | lodash | es-toolkit |
|---|---|---|
| 성능 | 표준적, 충분히 빠름 | 평균 2~3배 더 빠름 |
| 번들 크기 | 상대적으로 큼 | 최대 97% 더 작음 |
| 트리 셰이킹 | lodash-es는 지원, 기본 lodash는 미흡 | 매우 정밀하게 지원 |
| 타입 지원 | 타입스크립트 지원, 일부 any 혼용 | 안전하고 견고한 타입 제공 |
| 테스트 커버리지 | 널리 검증됨 | 100% 커버리지, 신뢰성 강조 |
| 생태계/호환성 | 매우 넓음, 레거시 코드 호환 | 최신 환경에 최적화, 일부 함수 미지원 |
| 사용법 | 오랜 기간 표준, 자료 풍부 | lodash와 거의 동일, 문서화 진행중 |
es-toolkit이 번들 사이즈, 성능 측면에서 더 큰 이점을 가져오기 때문에, es-toolkit을 사용하는 것이 최신 프로젝트에서는 더 좋을 것 같다.