전략(클릭 시 이동) | 위치 | 사용 시점 | 장점 | 단점 |
---|---|---|---|---|
서버 컴포넌트에서 fetch | app/page.tsx , app/layout.tsx 등 | HTML 생성 전 | 빠른 로딩, SEO 우수 | 동적 상호작용에는 부적합 |
클라이언트 컴포넌트 + useEffect | 'use client' 컴포넌트 | 마운트 후 | 사용자 상호작용 후 fetch 가능 | 초기 로딩 느릴 수 있음 |
SWR 또는 React Query | 클라이언트 컴포넌트 | 마운트 후 + 캐싱 | 캐싱, 재검증, refetch 자동화 | 번들 사이즈 증가 가능 |
라우트 핸들러 (API) | app/api/** | 서버 API 분리 필요 시 | 백엔드 역할 수행 가능 | 추가 구성 필요 |
ISR (revalidate) | 서버 컴포넌트 | 캐시 + 재생성 | 실시간성 보완 | 정해진 시간 내 캐시 유지 |
no-store | 서버 컴포넌트 | 항상 최신 데이터 | 매 요청마다 새로 fetch | 성능 비용 ↑ |
revalidate
로 최신화 주기 설정fetch('https://api.example.com/docs', {
next: { revalidate: 3600 }, // 1시간마다 갱신
});
const cookieStore = cookies();
const token = cookieStore.get('auth');
await fetch('https://api.example.com/user', {
headers: { Authorization: `Bearer ${token?.value}` },
});
'use client';
const { data, mutate } = useSWR('/api/posts', fetcher);
// 사용자 액션 후 mutate()
cache: 'no-store'
사용await fetch('https://api.example.com/status', { cache: 'no-store' });
fetch
사용법에서부터 캐시 전략, SWR, 라우트 핸들러, 캐시 무효화까지... 실제 프로젝트에서 필요한 거의 모든 사례를 커버했습니다.
Next.js의 데이터 패칭은 React와 밀접하게 연결되어 있으므로,