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 진입 시점을 활용하는 방식도 함께 고려해야 했다.