디바운스와 스로틀
짧은 시간 간격으로 연속해서 발생하는 이벤트(ex. scroll, resize, input, mousemove 등) 에 바인딩한 이벤트 핸들러는 과도하게 호출되어 성능에 문제를 일으킬 수 있다.
디바운스와 스로틀은 연속해서 발생하는 이벤트를 그룹화해서 코드의 성능을 최적화하는 프로그래밍 기법으로 타이머 함수를 사용해 구현된다.
Debounce(디바운스)
function debounce(func, delay) {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
const handleSearch = debounce(() => {
// 검색 API 호출
}, 500);
- 연속된 이벤트를 그룹화해서 마지막 이벤트가 발생하고 일정 시간이 지난 후에 이벤트 핸들러가 한 번만 호출되도록 하는 기술
- resize 이벤트 처리, 검색창 자동완성(사용자 타이핑 멈춘 후 API 호출), 버튼 중복 클릭 방지 처리, 입력 폼 유효성 검사 등에 사용
- (예) 텍스트 입력 필드에서 input 이벤트가 짧은 시간 간격으로 연속해서 발생하는 경우
- API 호출을 수행하는 함수를 디바운싱해 사용자가 몇 초 동안 입력을 중단한 후에만 함수가 실행되도록 할 수 있다.
- 서버 과부하 또는 관련 없는 결과가 반환될 수 있는 많은 API 호출을 피할 수 있다.
Throttle(스로틀)
function throttle(func, limit) {
let inThrottle = false;
return function (...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => {
inThrottle = false;
}, limit);
}
};
}
const handleScroll = throttle(() => {
// 스크롤 이벤트 처리
}, 1000);
- 연속된 이벤트를 그룹화해서 일정 주기마다 한 번씩만 실행되도록 제한하는 기술
- scroll 이벤트 처리, 무한 스크롤 UI 구현 등에 사용
- (예) 페이지 레이아웃을 조정하는 크기 조정 이벤트 핸들러
- 레이아웃을 업데이트하는 함수를 제한하여 100ms마다 한 번만 실행되도록 할 수 있다.
- 코드를 너무 자주 실행하여 사용자 인터페이스가 불안정해지거나 CPU 사용량이 높아지는 것을 방지할 수 있다.
디바운스와 스로틀의 차이점
// Debounce: _ _ _ _ _ X (300ms 후에 실행)
// Throttle: X _ _ X _ _ X (300ms 간격으로 실행)
Debounce(디바운스) | Throttle(스로틀) | |
실행 시점 | 마지막 이벤트 후 지정된 시간이 지나면 실행 | 일정 시간 간격으로 실행 |
사용 목적 | 연속된 이벤트의 마지막 한 번만 처리하고 싶을 때 | 일정 주기로 이벤트를 처리하고 싶을 때 |
성능 최적화 관점 | 불필요한 API 호출이나 계산을 줄이는 데 효과적 | 주기적인 업데이트가 필요한 경우에 리소스 사용을 제한 |
'JavaScript' 카테고리의 다른 글
arguments vs rest parameter (0) | 2024.12.23 |
---|---|
이벤트 루프와 실행 컨텍스트 (1) | 2024.12.20 |
클래스(class) (0) | 2024.12.19 |
프로토타입(prototype) (0) | 2024.12.18 |
클로저 (0) | 2024.12.15 |