프론트엔드 개발을 하다 보면 정말 많이 들어본 개념일 것입니다.
무의미하게 무수하게 발생하는 이벤트를 막기 위한 기법들입니다.
타이머 함수, setTimeout
을 통해서 간단하게 구현할 수 있습니다.
쓰로틀링(Throttle)
throttle은 영어로 조르다, 목을 조르다라는 의미를 가지고 있습니다.
이벤트의 목을 조른다(?)라고 볼 수 있는데요.
이벤트가 무수하게 발생하더라도, 일정 시간 동안 이벤트가 1번만 발생하도록 처리하는 것을 의미합니다.
스크롤 이벤트에 쓰로틀링을 적용해서 이벤트 최적화를 해볼 수 있는데요.
스크롤을 할 때 최적화하지 않으면, 이벤트가 무수히 많이 발생하기 때문입니다.
한 개의 버튼이 있고, 이 버튼을 누르면 로그인 기능이 동작한다고 가정해볼까요?
클릭방지를 하지 않는다면 유저가 버튼을 계속 클릭했을 때, 로그인 로직이 작동할 것입니다.
이 로직이 API를 호출하거나 상태값을 변경하거나 하면 골치아픈 문제가 될 수 있습니다.
쓰로틀링을 이용해서, 1초에 한번의 이벤트만 실행되도록 해봅시다.
// throttle.js
let timer = 0;
const handleLogin = () => {
console.log('클릭!');
if (timer) {
return;
}
timer = setTimeout(() => {
console.log('로그인!');
timer = 0;
}, 1000);
}
handleLogin 함수가 어떤 버튼에 클릭 이벤트로 등록이 되었다고 합시다.
위의 코드는 버튼을 계속 클릭하더라도, 1초동안 단 한번의 로그인! 로그를 남기고 있습니다.
눈으로 비교하기 쉽게 클릭과 로그인 로그를 남기도록 했습니다.
디바운싱(Debounce)
이벤트가 무수히 발생하더라도 마지막 이벤트를 기준으로 일정 시간이 지나면 이벤트를 1번만 발생시키는 기법입니다.
마지막 이벤트까지의 이벤트들을 하나의 그룹으로 생각해서, 한 개의 이벤트를 발생시키는 것입니다.
다른 말로 말하면, 일정한 시간이 지나기 전에 이벤트가 계속 발생하면 이벤트를 막아버립니다.
// debounce.js
let timer = 0;
const handleLogin = () => {
console.log('클릭!');
clearTimeout(timer);
timer = setTimeout(() => {
console.log('로그인!');
}, 1000);
}
'JavaScript' 카테고리의 다른 글
[Javascript] 이터러블과 이터레이터 개념정리 (2) | 2023.11.14 |
---|---|
[Javascript] 정규표현식을 이용한 다양한 패턴 예제 정리해보기 (1) | 2023.10.15 |
[Javascript] 2차원 배열 만들기 + 2차원 배열 순회 (0) | 2022.10.15 |
[Javascript] 스코프 체인이란..? (0) | 2022.09.10 |
[Javascript] 함수 선언문과 함수 표현식 (0) | 2022.09.10 |