Next.js 15を基準にしています。後のバージョンでは変更されている場合があります。
前回は
fetchの基本と、Server Componentsでデータを取得する方法を学びました。
今回は
キャッシュと再検証
、そして
fetchの高度な設定を掘り下げます。
Next.jsは既定ですべての
fetchをキャッシュします。
同じ要求が繰り返されても、同じレスポンスを再利用します。
サーバー資源を節約し、応答を速めるのに役立ちます。
ただし、常にキャッシュを使うのが適切とは限りません。
頻繁に変わる情報なら、キャッシュを無効にしたり、定期更新を設定したりできる必要があります。
cache: 'no-store'でキャッシュを切る 🔗
Next.jsは基本的にビルド時に取得し、静的に提供しようとします。
リアルタイムのデータが必要なら、次のように無効にできます。
const res = await fetch('https://jsonplaceholder.typicode.com/posts', {
cache: 'no-store',
});
これで、要求のたびに新しいデータを取得します。
next.revalidateで、
静的にキャッシュしたデータを一定時間後に再検証
するよう設定できます。
これをISR(Incremental Static Regeneration)と呼びます。
例:
const res = await fetch('https://jsonplaceholder.typicode.com/posts', {
next: { revalidate: 60 }, // 60초마다 새로 데이터를 가져옵니다
});
最初の要求では静的キャッシュを使い、60秒経過後はバックグラウンドで再取得します。
性能とデータの新しさを両立できます。
Next.jsは要求URL、ヘッダー、Cookieなどを基に、内部で
一意のキャッシュキー
を作ります。
URLやヘッダーが異なれば、別のキャッシュとして扱います。
次の二つは異なるキーを持ちます。
// 서로 다른 캐시 키
fetch('https://api.example.com/data?lang=en')
fetch('https://api.example.com/data?lang=ko')
言語、ユーザー権限、テーマなど、
要求ごとに異なる応答が必要な場合
は、クエリパラメーターやヘッダーで明示的に違いを表すとよいでしょう。
| 戦略 | 設定方法 | 説明 |
|---|
| 静的キャッシュ(既定) | なし | ビルド時にfetchし、キャッシュを使う |
|---|
| キャッシュなし | cache: 'no-store' | 常に最新を取得する |
|---|
| ISR | next: { revalidate: n } | n秒ごとにバックグラウンドで更新する |
|---|
export default async function Page() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts', {
next: { revalidate: 3600 }, // 1시간마다 재검증
});
const posts = await res.json();
return (
<ul>
{posts.map((post: { id: number; title: string }) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
要求時にキャッシュを使い、1時間後には自動で再取得するコードです。
今回は
fetchの高度な設定、とくにキャッシュ戦略を詳しく見ました。
no-store、
revalidate、内部のキー生成を理解すると、データフローをより精密に制御できます。
次回は
並列fetch
、
順次fetch
、
動的fetch
などのパターンを紹介します。
- ヘッダーやCookieを含む要求は、キャッシュへどのような影響を与えるでしょうか。
- 静的サイトでも、一部にリアルタイムの情報を表示できるでしょうか。