
이번 글에서는 아직 다루지 않은 SSR(Server-Side Rendering) 페이지의 풀 페이지 캐싱에 대해 이야기합니다.
SSR은 매 요청마다 서버에서 HTML을 생성하므로 항상 최신 데이터를 보장하지만, 그만큼 성능 부담이 큽니다.
그렇다면 SSR 페이지를 캐싱하면서도 신선함을 유지할 수 있는 방법은 무엇일까요?
따라서 풀 페이지 캐싱은 필수적인 최적화 전략이 됩니다.
캐싱하면 안 되는 경우:
실시간 주식 시세, 관리자 대시보드처럼 매 요청마다 다른 데이터가 필요한 경우
// app/product/[slug]/page.tsx
import { headers } from 'next/headers';
import { fetchProductBySlug } from '@/lib/data';
export const dynamic = 'force-dynamic';
export default async function ProductPage({ params }) {
const { slug } = params;
const product = await fetchProductBySlug(slug);
const responseHeaders = headers();
responseHeaders.set(
'Cache-Control',
'public, s-maxage=60, stale-while-revalidate=120'
);
return (
<main>
<h1>{product.title}</h1>
<p>{product.description}</p>
<p>Price: ${product.price}</p>
</main>
);
}
s-maxage=60: CDN에서 60초 동안 캐시 유지 stale-while-revalidate=120: 만료 후에도 최대 120초 동안은 오래된 버전을 즉시 제공하며 백그라운드에서 새로 갱신👉 Vercel, Netlify 등 CDN 기반 배포 환경에서 가장 간단하고 효과적인 방법
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export const config = { matcher: ['/product/:path*'] };
export function middleware(request: NextRequest) {
const geo = request.geo?.country || 'US';
const url = request.nextUrl.clone();
url.pathname = `/${geo.toLowerCase()}${url.pathname}`;
return NextResponse.rewrite(url, {
headers: {
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120',
},
});
}
👉 국가별, A/B 테스트, 언어별 변형된 페이지를 캐싱할 때 활용
// app/blog/[slug]/page.tsx
import { getPost } from '@/lib/posts';
export const revalidate = 60; // 60초마다 재생성
export default async function BlogPost({ params }) {
const post = await getPost(params.slug);
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.content }} />
</article>
);
}
👉 빠른 응답 + 일정 수준의 신선도 유지 가능
헤더 확인
curl -I https://your-domain.com/page
x-vercel-cache: HIT | MISS | STALE지역별 테스트
VPN 또는 Vercel CLI 사용
캐시 우회 요소 확인
Analytics 활용
no-store는 진짜 필요할 때만 사용stale-while-revalidate 적극 활용SSR 페이지를 캐싱한다는 것은 모순처럼 보일 수 있지만, 사실은 대규모 트래픽을 안정적으로 처리하기 위한 핵심 전략입니다.
을 적절히 활용하면, 최신성과 성능을 모두 잡는 SSR 페이지를 구현할 수 있습니다.