티스토리 뷰
개념
- input 타입에 onChange 이벤트를 걸어서 state의 변화를 준다면 사용자가 input창에 무언가를 입력할 때마다 이벤트 핸들러가 호출됩니다.
- scroll event의 경우도 마찬가지입니다. 만약 무한 스크롤 기능을 스크롤 이벤트로 구현한다면 스크롤이 맨 아래에 위치했는지 여부만 체크하면 되는데 스크롤을 움직일 때마다 이벤트가 연속적으로 호출됩니다.
- 댓글을 작성해서 submit 하는 것이나 스크롤이 맨 아래에 위치했는지 여부를 확인해야 하는 경우에 필요한 것보다 훨씬 많은 이벤트 호출이 발생하게 됩니다.
- Debounce와 Throttle은 이러한 연속적으로 호출되는 이벤트 핸들러의 실행 빈도를 제어함으로써 성능상의 유리함을 가져오기 위한 개념입니다.
Debounce
- 연이어 발생한 이벤트를 하나의 그룹으로 묶은 후 특정 시간이 지난 후 하나의 이벤트만 발생하도록 하는 기술 입니다.
- 주로 가장 마지막 호출이나 처음 호출만 유효하도록 합니다.
- 위는 실제 키입력이고 아래는 이벤트 발생을 나타낸 것인데요!
- 일정시간 안에 연속적인 클릭이 일어나면 이벤트를 발생시키지 않다가 특정 시간이 지나도 더이상 호출이 발생하지 않으면 그때서야 이벤트를 발생시킵니다.
- 리사이즈 이벤트와 같이 마지막 액션에 대한 처리가 중요한 경우에 필요한 마지막 값만을 추적하면서 리소스를 아낄 수 있겠네요!
Debounce 구현
import { useRef } from 'react';
function useDebounce<T extends any[]>(
callback: (...params: T) => void,
time: number,
) {
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
return (...params: T) => {
if (timer.current) clearTimeout(timer.current);
timer.current = setTimeout(() => {
callback(...params);
timer.current = null;
}, time);
};
}
export default useDebounce;
- Debounce는 연속적인 이벤트 호출이 일어나면 이벤트를 발생시키지 않으므로 매번 timer를 설정해서 관리합니다.
- 이미 지정된 timer가 있다면 clearTimeout을 통해 제거하고 새롭게 timer를 세팅하는 것입니다. 이벤트 호출이 일어날 때마다 새로운 timer가 지정되는 것이죠!
Throttle
- 이벤트를 일정 주기마다 발생하도록 하는 기술입니다.
- 이벤트 주기를 1초라고 하면 1초 안에는 단 한 번의 이벤트만 발생하도록 조절하는 것이죠!
- Throttle은 자동완성이나 무한 스크롤 기능에서 유용하게 사용될 수 있습니다. 계속해서 타이핑을 하거나 스크롤링을 해도 일정 주기마다 이벤트가 호출되므로 처리량은 조절하면서 해당 기능이 계속해서 동작하고 있다고 느끼게 할 수 있습니다.
Throttle 구현
import { useRef } from 'react';
function useThrottle<T extends any[]>(
callback: (...params: T) => void,
time: number,
) {
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
return (...params: T) => {
if (!timer.current) {
timer.current = setTimeout(() => {
callback(...params);
timer.current = null;
}, time);
}
};
}
export default useThrottle;
- Throttle은 이미 timer가 설정되어 있다면 아무 동작도 하지 않고 timer가 없다면(최초 호출) timer를 설정하게 됩니다.
- 그러면 이벤트 호출이 계속되는 동안 지정한 time마다 이벤트가 발생할 것입니다!
정리
- 디바운싱은 이벤트 호출이 더이상 발생하지 않을 때 특정 시간이 지나면 이벤트가 발생하며 리사이징 이벤트처럼 마지막 액션의 값이 중요할 때 사용하고
- 쓰로틀링은 일정한 주기마다 이벤트를 발생시키며 자동완성이나 무한 스크롤 기능에서 유용하게 사용할 수 있습니다!
관련 자료
반응형
'개발냥이 > 타입스크립트(Typescript)' 카테고리의 다른 글
[타입스크립트] 인덱스 시그니쳐(Index signature) 적용하기 (0) | 2023.09.10 |
---|---|
[리액트+타입스크립트] 프로젝트 리팩토링(refactoring)_사이드바(sidebar) (0) | 2023.07.31 |
[Next.js + 타입스크립트] 무한 스크롤(Infinite scroll) 구현해보기(feat. Intersection observer) (0) | 2023.07.15 |
[리액트+타입스크립트] 이미지 업로드 구현 & 이미지와 콘텐츠 하나의 객체로 관리하기 (0) | 2023.07.12 |
[Next.js + typescript] 페이지네이션(Pagination) 구현해보기 (0) | 2023.07.10 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Spring
- 자바트리
- 자바bfs
- 스프링부트
- DP
- Comparator
- CS
- 백준
- dfs
- 형변환
- 알고리즘
- JPA
- BFS
- 자바스크립트
- Queue
- 타입스크립트
- 해시맵
- 자바dp
- 스프링
- Nest
- 이분탐색
- java
- JavaScript
- Algorithm
- SQL
- 정렬
- 프로그래머스
- 리액트
- SQLD
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함