Server Components에서는 async/await를 직접 사용하여 데이터를 페칭할 수 있습니다.
// app/posts/page.tsx
async function getPosts() {
const res = await fetch('https://api.example.com/posts', {
next: { revalidate: 60 } // 60초마다 재검증
});
return res.json();
}
export default async function PostsPage() {
const posts = await getPosts();
return <PostsList posts={posts} />;
}fetch('url', {
cache: 'force-cache',
next: {
revalidate: 60
}
})• 캐시를 최대한 활용
• 빠른 응답 시간
• 정적 콘텐츠에 적합
• ISR (Incremental Static Regeneration)
• 주기적으로 캐시 갱신
• 블로그, 뉴스 등에 적합
• 캐시 사용 안 함
• 항상 최신 데이터
• 실시간 데이터에 적합
| 패턴 | 설명 | 사용 시나리오 | 코드 예제 |
|---|---|---|---|
| Sequential | 순차적으로 데이터 페칭 | 의존 관계가 있는 데이터 | await A; await B; |
| Parallel | 병렬로 데이터 페칭 | 독립적인 여러 데이터 | Promise.all([A, B]) |
| Streaming | Suspense로 점진적 로딩 | 느린 데이터 분리 | <Suspense> |
async function Page() {
// user가 필요
const user = await getUser();
// user.id가 필요
const posts = await getPosts(user.id);
return <UserPosts user={user} posts={posts} />;
}async function Page() {
// 병렬로 실행
const [user, posts, comments] = await Promise.all([
getUser(),
getPosts(),
getComments()
]);
return <Dashboard {...data} />;
}Next.js는 같은 URL과 옵션을 가진 fetch 요청을 자동으로 중복 제거합니다.
// Header.tsx const user = await getUser(); // Sidebar.tsx const user = await getUser(); // 2번 요청됨 (일반적인 경우)
// Header.tsx const user = await getUser(); // Sidebar.tsx const user = await getUser(); // 1번만 요청됨 (Next.js)