패스트캠퍼스 데브캠프

React useDebounce에 대해 알아보자

vitamin3000 2025. 1. 2. 18:38

 

아래와 같은 input의 값을 추적하는 코드가 있다고 가정해보자

 

  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
    setDesc(e.target.value);
  };

이때 input 안의 value가 '한글자 한글자'변경될 때마다 리랜더링될 것이다.

예를들어 10글자를 입력하는데 이러한 동작을 수행한다면 매우 비 효쥴적일 것이다.

 

따라서 useDebounce hook을 제작하여 이를 방지해보자.

 

간단히 설명하자면 value와 delay를 지정하여 delay만큼 지난 value의 값을 리렌더링하는 것이다.

 

제네릭 타입으로 지정하여, 모든 자료형을 수용할 수 있게 하였다.

import { useState, useEffect } from 'react';

type debounceProps<T> = {
  value: T;
  delay: number;
};

export function useDebounce<T>({ value, delay }: debounceProps<T>): T {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const handler = setTimeout(() => { 
      setDebouncedValue(value); //여기가 핵심!
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]); // warning 때문에 delay 추가

  return debouncedValue;
}

 

setTimeout을 이용하여, delay만큼 시간이 지난 후의 value를 setDebouncedValue에 넣는다.

 

다른 곳에서 사용할 때는 ..

 

const LabelInput = (props: LabelInputProps) => {
  const { title, placeholder, description } = props;
  const [desc, setDesc] = useState(description);

  const debouncedValue = useDebounce({ //여기서 호출
    value: desc,
    delay: 1000,
  });

  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
    setDesc(e.target.value);
  };

 

코드를 보면 실제로 debounceValue를 사용하는 부분은 존재하지 않는다

 

뭐야 적용 안된거 아니야?

할 수 있지만, useDebounce 함수 자체를 호출하고 있기 때문에 debounceValue에 저장되고 있다.