React의 성능 최적화 훅 useTransition

성능 최적화 훅 useTransition을 사용하면 UI를 차단하지 않고 상태(state)를 업데이트할 수 있습니다.

이 훅을 통해 특정 상태 업데이트에 낮은 우선순위를 부여할 수 있으며, 이렇게 하면 다른 상태 업데이트가 높은 우선순위를 가져 지연 없이 실행될 수 있습니다.

예를 들어, 사용자가 검색 입력란에 문자를 입력할 때 드롭다운 상품 목록의 필터링을 들 수 있습니다. 목록 자체는 약간의 지연과 함께 표시될 수 있지만, 검색 입력란에 문자가 지연되어 입력되는 것은 원하지 않을 것입니다.

이런 경우에 useTransition 훅이 어떻게 도움을 줄 수 있는지 살펴보겠습니다. 주요 컴포넌트의 코드 일부가 있다고 가정해 봅시다. 분석해 보겠습니다:

App.jsximport { useTransition } from 'react';
import { useState } from 'react';

function App() {
  const [isPending, startTransition] = useTransition();
  const [filterTerm, setFilterTerm] = useState('');
  
  const filteredProducts = filterProducts(filterTerm);
  
  function updateFilterHandler(event) {
    startTransition(() => {
      setFilterTerm(event.target.value);
    });
  }
 
  return (
    <div>
      <input type="text" onChange={updateFilterHandler} />
      <ProductList products={filteredProducts} />
    </div>
  );
}

여기서 useTransition을 위한 두 가지 변수를 볼 수 있습니다. 변수 isPending은 부울 값을 포함하며 업데이트 프로세스가 완료되었는지 여부를 나타내고, startTransition은 업데이트 우선순위를 낮출 수 있게 해주는 함수입니다:

App.jsxconst [isPending, startTransition] = useTransition();

또한 입력란에 입력된 검색어를 저장하는 상태 filterTerm과 이를 설정하는 함수 setFilterTerm이 있습니다:

App.jsxconst [filterTerm, setFilterTerm] = useState('');

인풋에 문자를 입력할 때마다 함수 updateFilterHandler가 호출되며, 여기서 filterTerm의 업데이트가 발생합니다. 바로 여기서 useTransition 훅을 적용하며, 설정 함수 setFilterTerm을 다음과 같이 startTransition으로 래핑합니다:

App.jsxfunction updateFilterHandler(event) {
  startTransition(() => {
    setFilterTerm(event.target.value);
  });
}

이렇게 하여 상태 filterTerm의 업데이트에 낮은 우선순위를 설정했으며, 이로 인해 우리의 입력 필드는 반응성을 유지할 것입니다.

변수 isPending을 사용하여 목록 업데이트가 아직 진행 중임을 사용자에게 표시할 수 있습니다. 목록이 업데이트되는 동안 입력 필드 아래에 이 정보를 출력해 보겠습니다:

App.jsxreturn (
  <div>
    <input type="text" onChange={updateFilterHandler} />
    {isPending && <p>업데이트 중 ...</p>}
    <ProductList products={filteredProducts} />
  </div>
);