티스토리 뷰
스크롤 이벤트를 다루면서 디바운싱과 쓰로틀링에 대한 개념을 새롭게 알게 되어 정리해두려고 한다.
디바운싱
method가 호출된 이후 일정시간이 지나기 전에 호출되지 않도록 하는 것
디바운싱은 키보드 타이핑을 입력하는 input이벤트의 경우 키 입력이 들어올 때마다 method를 호출하기 때문에 불필요한 method 호출을 줄이기 위해 주로 사용한다고 합니다. 이벤트가 발생할 때마다 일정 시간을 설정하고 그 시간 내에 다시 method 호출이 발생하면 기존의 시간을 리셋합니다. 만약 일정 시간이 지나도 method 호출이 없다면 그때 호출된 method에 대해서 연산을 수행하는 방식입니다.
디바운싱 적용 전
...
<input id='input'>
...
<script>
//디바운싱 적용 전
console.log('### 디바운싱 적용 전');
document.getElementById('input').addEventListener('input', function(e) {
console.log('method 호출', e.target.value);
});
</script>
...
키보드를 입력할 때마다 console.log가 작동하는 것을 확인할 수 있다.
디바운싱을 적용 후
...
<input id='input'>
...
<script>
// 디바운싱 적용 후
console.log('### 디바운싱 적용 후');
var timer;
document.getElementById('input').addEventListener('input', function(e) {
if (timer) clearTimeout(timer);
timer = setTimeout(function() {
console.log('method 호출', e.target.value);
}, 200);
});
</script>
...
디바운싱 적용 후에 확연히 메소드 호출이 입력 후에 한 번만 나타나는 것을 볼 수 있다.
쓰로틀링
일정 시간을 설정해 method가 호출된 이후 그 시간동안은 재호출 할 수 없도록 하는 방법
스크롤 이벤트에 많이 사용된다고 한다.
쓰로틀링 적용전
...
<div style='height: 1000px'></div>
...
<script>
//쓰로틀링 적용 전
window.addEventListener('scroll', function(e) {
console.log(window.scrollY);
});
</script>
...
스크롤을 조금 움직여도 method가 많이 호출되는 것을 확인할 수 있다.
쓰로틀링 적용 후
...
<div style='height: 1000px'></div>
...
<script>
//쓰로틀링 적용 후
console.log('### 쓰로틀링 적용 후');
var timer;
window.addEventListener('scroll', function(e) {
if (!timer) {
timer = setTimeout(function() {
timer = null;
console.log(window.scrollY);
}, 300);
}
});
</script>
...
비슷하게 스크롤했을 때 쓰로틀링 후에는 확연하게 호출 횟수가 줄어든 것을 확인할 수 있었다.
쓰로틀링과 디바운싱 모두 불필요한 method 호출을 줄여준다는 점이고,
차이점이라면 디바운싱은 몇 번을 호출하더라도 마지막 호출만 처리해주고, 쓰로틀링은 주기적으로 호출해준다는 점이 다를 수 있다.
두 가지 개념은 성능 면에서 아주 좋고, 알아두면 자주 사용할 수 있는 개념이라는 생각이 들었다.
'JavaScript' 카테고리의 다른 글
Loop (0) | 2022.05.30 |
---|---|
Intersection Observer를 통한 무한 스크롤 구현 (0) | 2022.03.10 |
[JS] querySelector 와 getElementBy~ (0) | 2021.12.22 |
- Total
- Today
- Yesterday
- Vue
- React
- programmers
- python
- js
- AxiosInterceptor
- 문제풀이
- webpack
- TypeScript
- 프로그래머스
- 백준
- SOAP API
- Vue.js
- bundler
- React.memo
- reactrouter
- SPA
- Preloading
- GraphQL
- redux-thunk
- Repository Pattern
- Vuex
- 파이썬
- 상호평가
- error
- 알고리즘
- redux
- v-for
- Transpiler
- clean code
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |