Next.js
Next.js 정적 페이지에 새 글이 404로 남았을 때 revalidate를 고친 기록
generateStaticParams를 쓴 글 페이지에서 새 게시물이 404로 남던 문제를 재현하고, 동적 파라미터와 재검증 기준을 분리해 해결한 기록입니다.
새 글은 DB에 있는데 주소만 404였다
관리자에서 글을 저장한 뒤 새 주소를 열었는데 배포 환경에서만 404가 났다. 목록에는 새 글이 보이기에 CDN 캐시를 먼저 의심했지만, 원인은 예전에 빌드 시간을 줄이려고 넣은 설정이었다.
빌드 목록과 요청 허용은 다른 문제였다
generateStaticParams는 빌드 때 만들 slug를 정한다. 여기에 없던 slug도 요청 때 만들려면 dynamicParams를 막으면 안 된다.
export const dynamicParams = true;
export const revalidate = 60;
export async function generateStaticParams() {
const posts = await getPopularPosts();
return posts.map((post) => ({ slug: post.slug }));
}
dynamicParams = false이면 반환 목록에 없는 새 글은 렌더링도 시도하지 않고 404가 된다. 반면 revalidate는 만들어진 결과를 언제 갱신할지의 기준이다. 나는 두 값을 모두 캐시 옵션이라고 생각해 원인을 늦게 찾았다.
없는 글일 때만 404를 냈다
import { notFound } from 'next/navigation';
const post = await getPost(params.slug);
if (!post) notFound();
return <Article post={post} />;
API 오류와 없는 글을 같은 null로 돌리면 장애가 404로 숨는다. 실제 서비스에서는 오류 타입을 분리해 500으로 기록했다.
배포 뒤 체크
- 새 slug가 목록과 상세 API에서 조회되는지 확인한다.
- 시크릿 창에서 배포 주소를 연다.
- 404면
dynamicParams, 반환 slug, 배포 로그 순으로 본다. - 새 글이 즉시 보여야 하는지에 맞춰 재검증 시간을 정한다.
정적 생성은 새 데이터를 금지하는 선언이 아니다. 인기 글만 미리 만들고 나머지는 요청 시 만들도록 기준을 남겼다.