디버브와 스로틀 기법을 통한 JavaScript 성능 최적화
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
프론트엔드 개발자, 특히 이벤트 처리와 성능 최적화에 관심 있는 개발자
핵심 요약
- 디버브(debounce)는 사용자 입력이 중단된 후에만 함수를 실행하는 기법으로,
input
이벤트와 검색 자동완성에 적합 - 스로틀(throttle)는 정해진 시간 간격마다만 함수를 실행하는 기법으로,
resize
이벤트나 스크롤 애니메이션에 적합 - Lodash와 같은 라이브러리의
debounce
/throttle
함수를 사용하여 복잡한 구현을 피할 수 있음 - 성능 향상을 위해 이벤트 빈도, 함수 실행 시간, 브라우저 호환성을 고려해야 함
섹션별 세부 요약
1. 도입 및 배경
- 프론트엔드 개발에서
scroll
,resize
,input
등 자주 발생하는 이벤트는 성능 저하를 유발 - 이벤트 처리 최적화를 위해 디버브와 스로틀 기법이 등장
- 초기 자바스크립트에서
requestAnimationFrame
과Lodash
등 도입 전에는 직접 구현 필요
2. 디버브 기법
- 사용자 입력이 중단된 후에만 실행: 예) 검색 자동완성에서 API 호출 최적화
debounce(func, delay)
함수로 구현:setTimeout
을 사용해 타이머 재설정- 즉시 실행 옵션 추가:
debounceAdvanced(func, delay, immediate)
3. 스로틀 기법
- 정해진 간격마다 실행: 예)
resize
이벤트 처리 시 DOM 재계산 방지 throttle(func, limit)
함수로 구현:setTimeout
을 사용해 실행 간격 제어throttleAdvanced(func, limit, options)
로 leading/trailing 실행 옵션 추가
4. 디버브 vs 스로틀 비교
- 디버브: 입력 중단 후 실행 (예:
input
이벤트) - 스로틀: 정해진 간격마다 실행 (예:
scroll
,resize
이벤트)
5. 라이브러리 활용
- Lodash의
debounce
/throttle
사용 예:
import { debounce, throttle } from 'lodash';
const debouncedFunc = debounce(() => console.log('Debounced!'), 500);
const throttledFunc = throttle(() => console.log('Throttled!'), 500);
6. 주요 사용 사례
- 검색 자동완성: 디버브로 API 호출 감소
- 스크롤 애니메이션: 스로틀로 성능 향상
- 반응형 디자인:
resize
이벤트 스로틀로 DOM 계산 최적화 - 폼 제출 방지: 디버브로 중복 제출 방지
7. 고려 사항
- 함수 실행 시간:
Chrome DevTools
로 성능 분석 - 이벤트 빈도:
requestAnimationFrame
활용 - 브라우저 호환성:
performance.now()
등 폴리필 필요
8. 디버깅 전략
- 로깅:
console.log
로 함수 호출 횟수 추적 - 프로파일링: 복잡한 애플리케이션의 실행 컨텍스트 분석
- 단위 테스트:
Jest
로 디버브/스로틀 동작 검증
test('Debounce function should only be called once after 300ms', done => {
const mockFunc = jest.fn();
const debouncedFunc = debounce(mockFunc, 300);
debouncedFunc();
debouncedFunc();
setTimeout(() => {
expect(mockFunc).toHaveBeenCalledTimes(1);
done();
}, 400);
});
결론
- 디버브와 스로틀은 자주 발생하는 이벤트 처리 시 성능 최적화에 필수적
- Lodash 등 라이브러리 사용을 통해 구현 복잡도를 줄이고, 브라우저 호환성과 이벤트 빈도를 고려해 적용
- 단위 테스트와 프로파일링 도구를 활용해 기능이 예상대로 작동하는지 검증해야 함