문제 배경

커스텀 명언 카드 생성 화면에서 QuotesStyler 컴포넌트 내부의 input 요소가 onChange 이벤트로 상태를 즉시 업데이트하고 있었고, 이는 Zustand 상태를 통해 캔버스를 리렌더링하는 구조였다. 모바일 환경에서 사용자 입력이 많아질수록 이벤트 호출이 과도하게 발생해 화면 지연과 성능 저하가 발생했다.

개선 방법

'use client'

export default function QuotesSizeStyler({ selectTapNum }: PropsType) {

   // 디바운스 클로저
  function debounce(){
    let timerId: NodeJS.Timeout;
   
    return function (newValue: number, targetName:string, delayTime:number) {
      clearTimeout(timerId)

      timerId = setTimeout(()=>{
        setState({...state, [targetName]:newValue})
      }, delayTime)
    }
  }

  // 디바운스 함수 호출 : debonce 함수의 클로저 반환하고 이를 활용.
  const debounceClozer = debounce()
   
  return (
          {/* 캔버스 넓이 */}
        <input
          onChange={(e) => {
            const width = Number(e.currentTarget.value)
            debounceClozer(width, 'width', 500)
          }}
        ></input>
  )
}

[참고] 디바운싱 적용 전 후 비교

image.png

성과 및 배운점

성과

배운점