React 19 Suspense의 프리페칭 전략 개선

문제 상황

관리자 대시보드에서 탭을 전환할 때마다 1~2초의 로딩 시간이 발생했다. 각 탭이 독립적인 데이터를 fetching하는 구조였고, 사용자가 탭을 클릭한 후에야 데이터를 요청하기 때문이었다.

해결 방법

React 19의 Suspense와 use hook을 활용해 프리페칭 전략을 적용했다.

const useTabPrefetch = (tabKey) => {
  const prefetchRef = useRef(new Map());
  
  const prefetch = (key) => {
    if (!prefetchRef.current.has(key)) {
      const promise = fetchTabData(key);
      prefetchRef.current.set(key, promise);
    }
  };
  
  return { prefetch, getData: (key) => prefetchRef.current.get(key) };
};

function Dashboard() {
  const [activeTab, setActiveTab] = useState('overview');
  const { prefetch, getData } = useTabPrefetch();
  
  return (
    <div>
      <TabList 
        onMouseEnter={(key) => prefetch(key)}
        onChange={setActiveTab}
      />
      <Suspense fallback={<Spinner />}>
        <TabContent data={getData(activeTab)} />
      </Suspense>
    </div>
  );
}

마우스 호버 시점에 해당 탭의 데이터를 미리 요청하도록 했다. 사용자가 탭을 클릭하는 시점에는 이미 데이터가 준비되어 있어 즉시 렌더링된다.

결과

  • 탭 전환 시 체감 로딩 시간 80% 감소
  • 불필요한 프리페칭을 방지하기 위해 호버 이벤트 활용
  • 메모리 누수 방지를 위해 컴포넌트 언마운트 시 캐시 정리

프리페칭은 사용자 행동 패턴을 예측할 수 있을 때 특히 효과적이다. 다만 모바일에서는 호버 이벤트가 없으므로 viewport 진입 시점을 활용하는 방식도 함께 고려해야 했다.