작성
·
23
0
안녕하세요! 좋은 Next.js 강의 덕분에 열심히 배워나가고 있는 학생입니다. 😀
다름이 아니라 revalidateTag를 사용했을 때, 첫 번째 인수로 전달한 태그 값을 가지는 데이터 캐시가 재검증된다고 이해했는데요!
제가 revalidateTag의 인수와 data fetch에 사용되는 옵션의 태그 값을 다르게 세팅해봤는데도 갱신이 되어서요.
제가 잘못 이해한 걸까요..?? 이 부분이 이상해서 질문 남깁니다.
아래는 제가 작성한 코드입니다!
createReviewAction
export async function createReviewAction(formData: FormData) {
const bookId = formData.get('bookId')?.toString();
const content = formData.get('content')?.toString();
const author = formData.get('author')?.toString();
if (!bookId || !content || !author) {
return;
}
// JSON.stringify 객체를 문자열 형태로 직렬화 해서 보내줘야 함
try {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERVER_URL}/review`,
{
method: 'POST',
body: JSON.stringify({ bookId, content, author }),
},
);
revalidateTag(`revew-${bookId}`); // 일부로 오타 냄
} catch (error) {
console.error(error);
return;
}
}
ReviewList 컴포넌트
async function ReviewList({ bookId }: { bookId: string }) {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERVER_URL}/review/book/${bookId}`,
{ next: { tags: [`review-${bookId}`] } },
);
if (!response.ok) {
throw new Error(`Review fetch faild: ${response.statusText}`);
}
const reviews: ReviewData[] = await response.json();
return (
<section>
{reviews.map((review) => (
<ReviewItem key={`review-item-${review.id}`} {...review} />
))}
</section>
);
}
답변 2
0
안녕하세요 이정환입니다.
ReviewList에서 호출한 fetch 메서드의 데이터 캐시가 혹시 어떤 타이밍에 검증되나요?
PS.
참고로 개발모드로 동작 중에는 페이지를 강하게 새로고침 했을 때 데이터가 강제로 검증됩니다.
혹시 개발모드로 실험해보셨다면 프로덕션 모드로도 다시 실험해보시면 문제 없이 동작할 수 있습니다.
안녕하세요 이정환입니다.
오잉 ..!? 이상하네요 정확한 원인 파악을 위해서는 전체 프로젝트 코드를 받아 제가 확인해봐야 할 것 같습니다. 깃허브 or 구글 드라이브 링크로 보내주시면 살펴볼게요!
0
안녕하세요, 인프런 AI 인턴입니다. fud3725님.
revalidateTag
함수의 동작에 대해 궁금하신 점에 대해 답변드리겠습니다.
revalidateTag
함수는 특정 태그와 연관된 캐시 데이터를 재검증하여, 변경된 데이터가 클라이언트에게 전달되도록 하는 역할을 합니다. 이를 통해 특정 데이터만을 효율적으로 업데이트할 수 있습니다.
작성해주신 코드에서 revalidateTag
사용시 오타를 의도적으로 발생시켰다고 하셨는데, 그럼에도 캐시가 갱신되는 것은 의도하지 않은 상황입니다.
revalidateTag(`revew-${bookId}`); // 일부로 오타 냄
여기서 revew-${bookId}
대신 review-${bookId}
라는 정확한 태그명을 전달해야만 해당 태그로 캐싱된 데이터가 요청 시 새롭게 갱신됩니다.
반대로, ReviewList
컴포넌트에서는 올바른 태그(review-${bookId}
)를 사용하고 있으므로, fetch 요청 시마다 정상적으로 재검증이 이루어져야 하지만, 오타 때문에 이를 기대할 수 없게 됩니다. 해당 코드의 동작이 일관되지 않다면, 정확한 태그명 사용을 확인하는 것이 우선일 것입니다.
createReviewAction
과 ReviewList
컴포넌트 모두 동일한 태그 규칙을 사용해야 합니다.revalidateTag
함수 호출 시 태그명을 정확하게 맞춰주세요.next: { tags: [...] }
옵션이 의도대로 설정되어 있는지, 서버 설정을 포함해 한 번 더 점검해보세요.관련 예제나 설정에 대해서는 Next.js 공식 문서의 Data Fetching 섹션을 참조하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
리뷰 내용을 작성하고, '작성하기' 버튼을 클릭했을 때 입니다!
ReviewList 컴포넌트 내에서 호출하는 API의 tag를 review-bookId를 설정해두고, 작성하기 버튼 클릭 시 createReviewAction 실행 -> 내부에서 리뷰 등록 API 호출 -> revalidateTag('review-bookId')를 호출하면 재검증이 되는 것으로 이해했는데, 태그 값이 달라도 재검증이 되는 것 같아서 질문드렸어요.
프로덕션 모드로 실행해도 동일하게 재검증이 되네요......