Nuxt 3 프로젝트에서 블로그 상세 페이지를 구현하던 중, 다음과 같은 문제가 발생했습니다:
이 문제는 URL이 변경됨에도 불구하고, 이전 포스트의 데이터가 계속 출력되는 캐싱 관련 문제로 확인되었습니다.
Nuxt 3의 useAsyncData는 내부적으로 캐싱 메커니즘을 사용하여 불필요한 네트워크 요청을 줄이는 방식으로 동작합니다. 하지만 이 메커니즘이 문제를 유발할 수 있는 상황이 있습니다.
const { data: post } = await useAsyncData(() => {
return queryCollection("blog").path(route.path).first();
});
useAsyncData는 Key를 명시적으로 설정하지 않으면, 코드 블록 자체를 기준으로 Key를 생성합니다. 따라서 이 코드에서는 Key가 항상 동일하게 고정됩니다. Nuxt는 동일 Key를 가진 데이터 요청의 결과를 캐싱하여 재사용합니다.
이로 인해 URL은 정상적으로 바뀌지만, 이전 블로그 포스트의 내용이 계속 출력되는 문제가 발생합니다.
문제를 해결하기 위해 Key를 URL 경로(route.path)에 따라 동적으로 설정했습니다.
const { data: post, error, refresh } = await useAsyncData(`blog-post-${route.path}`, () => {
return queryCollection("blog").path(route.path).first();
});
배포 환경에서는 Nuxt 3의 SSG(Static Site Generation) 또는 ISR(Incremental Static Regeneration) 방식이 추가적으로 적용됩니다. 따라서 JSON 캐싱과 HTML 프리렌더링이 문제 해결에 영향을 줄 수 있습니다.
/_nuxt/data/blog.json // 모든 경로에 대해 동일 파일 사용
/_nuxt/data/blog-post-/blog/1.json
/_nuxt/data/blog-post-/blog/2.json
_nuxt/data/blog-post-/blog/1.json
_nuxt/data/blog-post-/blog/2.json
.output/public/blog/1/index.html
.output/public/blog/2/index.html
이와 같은 Key 설정은 동적 데이터를 사용하는 모든 Nuxt 프로젝트에서 중요한 패턴이며, 특히 캐싱 문제가 발생할 수 있는 상황에서 반드시 고려해야 합니다.