본문으로 건너뛰기

캐시

이 문서로 해결할 질문

  • Next.js ISR/Data Cache와 React Query 캐시는 어떻게 구분되나요?
  • cache.policy.ts 기준 값은 무엇인가요?
  • 레시피 상세 온디맨드 revalidate는 어떻게 트리거하나요?

캐시 레이어 개요

각 레이어는 독립적이며, 같은 데이터라도 TTL·무효화 경로가 다릅니다.

Next.js Data Cache (ISR)

Next.js Data Cache(ISR) 기준은 client/src/lib/policy/cache.policy.ts·client/src/lib/constants/cache-tags.constants.ts에 정의되어 있습니다.

상수용도
ISR_FETCH_REVALIDATE_SEC300초주기 ISR revalidate
ISR_RECIPE_LIST_FETCH{ next: { revalidate: 300, tags: ['recipes','recipe-list'] } }레시피 메인
ISR_RECIPE_CATEGORIES_FETCHtags recipes·recipe-categories레시피 필터
ISR_INGREDIENT_CATEGORIES_FETCHtags ingredients·ingredient-categories재료 필터
isrRecipeDetailFetch(id){ revalidate: false, tags: ['recipes','recipe-detail','recipe:{id}'] }레시피 상세 — tag 무효화만

캐시 태그

태그무효화 범위
recipes레시피 관련 fetch 전체
recipe-list/recipe 목록
recipe-detail모든 레시피 상세 fetch
recipe:{id}특정 레시피 상세
recipe-categories/recipe/filter
recipe-static-idsgenerateStaticParams
ingredients재료 관련 fetch
ingredient-categories/ingredient/filter
sitemapsitemap 레시피 URL

페이지별 적용

페이지전략
/recipeISR + CSR (공개 섹션 주기 ISR, 개인화 추천 CSR)
/recipe/filter, /ingredient/filter주기 ISR (300초)
/recipe/[id]온디맨드 ISR + generateStaticParams(10건)
/recipe/searchSSR (ISR 없음)
챗봇·보관함·마이페이지·인증CSR

ISR fetch 예외 처리

상황동작
CI 빌드 (CI=true)fetch 실패 시 empty fallback — 빌드 통과
로컬 빌드fetch 실패 시 throw — 조기 발견
런타임 재검증 실패throw — stale HTML 유지 (빈 화면 덮어쓰기 금지)

ISR fetch 헬퍼는 fetchForIsr()이며, client/src/.../isr-fetch.server.ts에 구현되어 있습니다.

온디맨드 revalidate

POST /api/revalidate
Content-Type: application/json

{
"secret": "<REVALIDATE_SECRET>",
"tags": ["recipes", "recipe:123", "recipe-list", "recipe-static-ids", "sitemap"]
}

각 태그에 대해 revalidateTag(tag)를 호출합니다. 태그 형식은 cache-tags.constants.tsCACHE_TAG_PATTERN을 따릅니다.

React Query 캐시

React Query 캐시 기준은 client/src/.../cache.policy.tsQUERY_DEFAULTS, QUERY_CACHE입니다.

도메인staleTimegcTime
기본5분30분
recipeList5분30분
recommended20분60분
recipeDetail10분60분
ingredient60분24시간
user1분10분
inventory30초10분
chatbot30초10분

Optimistic Update

Command API(POST/PUT/DELETE) 성공은 Kafka 발행까지만 보장합니다. 뮤테이션 후 refetch 대신 setQueryData로 캐시 직접 갱신합니다.

자세한 내용은 상태 관리 — Optimistic Update 문서를 참고하세요.

Producer Redis와의 관계

CSR/ISR 페이지가 호출하는 API는 Producer Redis 캐시를 거칩니다.

데이터Producer TTL프론트 캐시
개인화 추천3600초React Query 20분
레시피 상세900초ISR on-demand + RQ 10분
재료 목록86400초RQ 60분

Consumer 캐시 무효화 후 다음 API 호출 시 DB로 폴백하며, 프론트는 별도 무효화 없이 staleTime 만료 또는 수동 invalidate로 갱신합니다.

관련 문서