- React 19가 도입되면서
useTransition,useOptimistic,useFetcher등 새로운 기능이 추가되었다. - 이 기능들을 활용하면 React Query의 어떤 기능을 대체할 수 있을까?
- 그리고 완전히 대체할 수 없는 기능은 무엇일까?
React Query는 서버 상태 관리를 쉽게 하기 위해 만들어진 라이브러리로, 일반적으로 다음과 같은 기능을 제공한다.
✅ 자동 데이터 페칭 (useQuery)
✅ 데이터 캐싱 (staleTime, cacheTime)
✅ 자동 재시도 (retry 옵션)
✅ 백그라운드 데이터 갱신 (refetchInterval)
✅ Suspense 지원 (suspense: true)
✅ 에러 핸들링 및 상태 관리 (isLoading, isFetching, isError)
✅ 낙관적 UI 업데이트 (useMutation)
React 19의 useTransition, useOptimistic, useFetcher를 활용하면 일부 기능은 대체 가능하지만, 완전히 대체하기는 어렵다.
어떤 기능을 대체할 수 있고, 어떤 기능은 여전히 React Query가 필요한지 정리해보자.
React Query 역할:
isLoading상태를 제공하여 데이터가 로딩 중인지 확인- 로딩 상태에 따라 UI를 다르게 표시
React 19로 대체 가능한 부분:
useTransition을 사용하면 비동기 상태 업데이트 시 UI 응답성을 유지isPending을 활용하여 로딩 상태를 대체 가능
const [isPending, startTransition] = useTransition();
const [pokemon, setPokemon] = useState(null);
const fetchData = () => {
startTransition(async () => {
const response = await fetch(`/api/pokemon/${id}`);
const result = await response.json();
setPokemon(result);
});
};
return (
<div>
{isPending ? <p>Loading...</p> : <p>{pokemon?.name}</p>}
<button onClick={fetchData}>Fetch Pokemon</button>
</div>
);📌 요약
useTransition은 네트워크 요청을 최적화하지 않지만, UI가 멈추지 않도록 우선순위를 조정isPending을 활용하여 React Query의isLoading을 대체 가능
React Query 역할:
useMutation을 활용해 데이터 업데이트를 즉시 반영- 백엔드 응답이 오기 전에 UI를 업데이트하여 사용자 경험 개선 (Optimistic UI)
React 19로 대체 가능:
useOptimistic을 사용하면 즉시 UI 업데이트 후, 백엔드 응답이 실패하면 자동으로 원래 상태로 복구
const [optimisticPokemon, setOptimisticPokemon] = useOptimistic(pokemon);
const updatePokemon = async () => {
setOptimisticPokemon((prev) => ({ ...prev, name: "New Pokemon" }));
await fetch("/api/pokemon", {
method: "POST",
body: JSON.stringify({ name: "New Pokemon" }),
});
};📌 요약
useOptimistic은 실패 시 자동으로 이전 상태로 복구되므로 별도의 롤백 로직이 필요 없음
- React Query는
useQuery를 사용하여 자동으로 데이터를 불러오고 상태를 관리 useFetcher는 Suspense를 활용한 데이터 로딩만 가능하며, 자동 데이터 페칭 기능이 없음
const fetcher = useFetcher();
const pokemon = fetcher.read("/api/pokemon");
<Suspense fallback={<p>Loading...</p>}>
<PokemonComponent data={pokemon} />
</Suspense>;📌 요약
- React 19는
useQuery의 자동 데이터 페칭 기능을 대체할 수 없음.
const fetchDataWithRetry = async (retryCount = 3) => {
try {
const response = await fetch(`/api/pokemon/${id}`);
if (!response.ok && retryCount > 0) {
return fetchDataWithRetry(retryCount - 1);
}
return response.json();
} catch (error) {
console.error("Fetching failed", error);
}
};📌 React Query는 retry 옵션을 제공하지만, React 19에서는 직접 구현해야 함
React 19는 데이터 캐싱 및 백그라운드 데이터 갱신 기능이 내장되어 있지 않음.
React Query의 staleTime, cacheTime, refetchInterval을 직접 구현해야 함.
📌 요약
- React 19는 데이터 캐싱 및 자동 갱신 기능이 없으므로, React Query가 여전히 필요함.
| 기능 | React Query | React 19 (useTransition, useOptimistic, useFetcher) |
|---|---|---|
| 자동 데이터 페칭 | ✅ | ❌ (직접 구현 필요) |
| 데이터 로딩 최적화 | ✅ | ✅ (useTransition 활용) |
| 낙관적 UI 업데이트 | ✅ | ✅ (useOptimistic 활용) |
| Suspense 지원 | ✅ | ✅ (useFetcher 활용) |
| 자동 재시도 | ✅ | ❌ (직접 구현 필요) |
| 데이터 캐싱 | ✅ | ❌ (직접 구현 필요) |
| 백그라운드 데이터 갱신 | ✅ | ❌ (직접 setInterval 등 사용 필요) |
- React 19는 로딩 상태 관리 (
useTransition), 낙관적 UI (useOptimistic) 등 일부 기능을 대체 가능 - 하지만, 자동 데이터 페칭, 자동 재시도, 데이터 캐싱, 백그라운드 데이터 갱신 기능이 없어서 완전히 대체하기는 어렵다.
- React Query 없이 React 19만 사용할 경우, 많은 추가 구현이 필요하다.