FE develop/Next.js
Next.js - (13) revalidatePath를 통한 캐시 유효성 갱신
hoj0806
2025. 5. 2. 16:23
이번 포스트에서는 Next.js에서 서버 액션(Server Action)을 이용해 데이터를 추가한 후, 페이지 캐시를 갱신하여 변경 사항이 바로 반영되도록 하는 방법을 살펴보겠습니다.
✅ 문제 상황
아래는 사용자가 폼을 제출해 새로운 게시물을 추가하고, /meals 페이지로 리디렉션하는 코드입니다
export async function shareMeal(prevState, formData) {
"use server";
const meal = {
title: formData.get("title"),
summary: formData.get("summary"),
instructions: formData.get("instructions"),
image: formData.get("image"),
creator: formData.get("name"),
creator_email: formData.get("email"),
};
if (isInvalidText(meal.title) || isInvalidText(meal.summary)) {
return {
message: "Invalid input.",
};
}
await saveMeal(meal);
redirect("/meals");
}
이 코드는 개발 환경에서는 정상 작동하며, 게시물 등록 후 /meals 페이지에 가면 곧바로 새 게시물이 보입니다.
하지만 프로덕션 빌드 후에는 새 게시물이 바로 반영되지 않습니다.
❓ 왜 그럴까요?
Next.js의 기본적인 데이터 캐싱 정책 때문입니다.
- /meals 페이지는 서버에서 처음 렌더링된 이후, 캐시된 HTML이 사용됩니다.
- 새로운 게시물을 추가해도 캐시가 갱신되지 않기 때문에 변경 사항이 보이지 않습니다.
✅ 해결 방법: revalidatePath
이를 해결하기 위해 Next.js에서 제공하는 revalidatePath 함수를 사용할 수 있습니다.
import { revalidatePath } from "next/cache";
await saveMeal(meal);
revalidatePath("/meals");
redirect("/meals");
revalidatePath(path, type?)
- path: 캐시를 무효화할 경로 (예: /meals)
- type: 'page' 또는 'layout' (기본값은 'page')
layout을 사용하면 해당 레이아웃을 공유하는 모든 중첩 라우트까지 포함해 캐시를 무효화합니다. 현재는 /meals 페이지만 갱신하면 되므로 기본값('page')을 사용하면 충분합니다.
🧪 최종 코드
"use server";
import { redirect } from "next/navigation";
import { saveMeal } from "./meals";
import { revalidatePath } from "next/cache";
function isInvalidText(text) {
!text || text.trim() === "";
}
export async function shareMeal(prevState, formData) {
"use server";
const meal = {
title: formData.get("title"),
summary: formData.get("summary"),
instructions: formData.get("instructions"),
image: formData.get("image"),
creator: formData.get("name"),
creator_email: formData.get("email"),
};
if (isInvalidText(meal.title) || isInvalidText(meal.summary)) {
return {
message: "Invalid input.",
};
}
await saveMeal(meal);
revalidatePath("/meals");
redirect("/meals");
}
✅ 정리
- Next.js에서는 캐싱 덕분에 성능이 좋아지지만, 데이터가 변한 후 이를 반영해주는 추가 작업이 필요합니다.
- revalidatePath를 통해 지정한 경로의 캐시를 무효화하면 변경된 데이터가 즉시 반영됩니다.
- 이 방식은 데이터 추가, 수정, 삭제 등 서버에서 상태 변화가 일어났을 때 매우 유용하게 사용됩니다.