키업으로 하게되면 api 호출을 자주 하게 되어 성능 저하의 문제가 있습니다.
그래서 debounce 이용하여 검색 기능을 구현해 보았습니다.
- 디바운싱(Debouncing)은 시간이 많이 걸리는 작업이 자주 실행되지 않도록 사용되는 프로그래밍 방법입니다.
- 디바운싱은 함수가 실행되기 전에 일정 시간을 대기하도록 합니다. 즉, 함수가 호출되는 속도를 제한합니다.
- 함수가 여러 번 호출되면, 일정 시간이 지난 후 마지막에 호출된 함수만 실행되고 이전의 호출된 함수는 무시됩니다.
키업을 기준으로 코드를 짯습니다.
const Debounce = () => {
//일반 input state
const [normalValue, setNormalValue] = useState<string>('');
//일반 input change
const normalChange = (e: React.FormEvent<HTMLInputElement>) => {
setNormalValue(e.currentTarget.value);
};
return (
<>
<Styled.Wrap>
<Styled.InputWrap>
<Styled.SearchInput
placeholder="Nomal 입력"
type="text"
value={normalValue}
onChange={normalChange}
/>
<p> Normal: {normalValue}</p>
</Styled.InputWrap>
</Styled.Wrap>
</>
);
};
이런식으로 하게 되면 input 박스에 글자를 입력 할때마다 state에 값을 실시간으로 업데이트 하게 됩니다.
만약 api호출을 하게된다면 글자 하나하나 당 api를 호출하기 때문에 성능 저하의 원인이 될수 있습니다.
그래서 debounce 를 이용하여 일정 시간이 지난 후 마지막에 호출된 함수만 실행시키게 만들어 보았습니다.
const Debounce = () => {
//input state
const [debounceValue, setDebounceValue] = useState<string>('');
//debounce input state
const [debounceResultValue, setDebounceResulValue] = useState<string>('');
//input에 들어오는 글자
const debounceChange = (e: React.FormEvent<HTMLInputElement>) => {
setDebounceValue(e.currentTarget.value);
};
//debounce 처리된 input 값
const debounceValueChange = (searchValue: string) => {
setDebounceResulValue(searchValue);
};
//디바운스 시간 처리 및 함수 호출
const debouncedSearchTerm = useDebounce(debounceValue, 500);
//debounce 일정 시간 호출 되는지 확인
function useDebounce(value: string, delay: number) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
//debounce 실시간 처리
useEffect(() => {
if (debouncedSearchTerm) {
debounceValueChange(debouncedSearchTerm);
} else {
setDebounceResulValue('');
}
}, [debouncedSearchTerm]);
return (
<>
<Styled.Wrap>
<Styled.InputWrap>
<Styled.SearchInput
placeholder="Debounce 입력"
type="text"
value={debounceValue}
onChange={debounceChange}
/>
<p>Debounce: {debounceResultValue}</p>
</Styled.InputWrap>
</Styled.Wrap>
</>
);
};
위에서 부터 코드를 설명 하겟습니다.
사진으로 키업과 debounce의 차이점을 보여드리겠습니다
키업으로 항상 검색 같은 기능을 구현 하였는데 이렇게 debounce 같이 웹성능 최적화 작업을 알게되어 기뻣다. 오늘도 성장하는 개발자가 되어가도록 하자!!