Next.js · Caching

ISR Cache Lifecycle

요청은 자동으로 발생하지 않으며 직접 보냅니다. 만료 뒤 첫 요청은 기존 버전을 0ms에 받고, 동시에 백그라운드 재생성을 시작합니다. 이 인과 관계를 화살표로 보여줍니다. export const revalidate 기준의 이전 모델이며, cacheComponents에서는 cacheLife가 그 역할을 합니다.

캐시 나이 0.0s / 10s
HITSTALE백그라운드 재생성
누적 HIT 0STALE 010초가 지나도 저절로 재생성되지 않습니다 — 다음 요청이 도착해야 그 요청이 구버전을 받고 동시에 재생성을 시작시킵니다

최근 요청 5건 — 항목에 마우스를 올리면 트랙 위 해당 마커가 강조됩니다.

  • 시간이 지나도 저절로 재생성되지 않는다incremental-static-regeneration.md:100-101,583 · cacheLife.md:92,112

    만료(revalidate)는 "이제 낡았다"는 표시일 뿐이다. 다음 요청이 도착해야 그 요청이 ① 구버전을 0ms에 받고 ② 동시에 백그라운드 재생성을 시작시킨다. 문서도 그 요청을 triggering request라고 부른다. 트래픽이 전혀 없으면 그 페이지는 옛날 버전 그대로 남는다.

  • 이전 모델 — cacheComponents 미사용route-segment-config/index.md:19

    export const revalidate = 10 기준의 화면이다. 동작 서술은 Next 16에서도 그대로 유효하지만, next.config에 cacheComponents: true를 켜면 revalidate·dynamic·dynamicParams·fetchCache 세그먼트 옵션은 16.0.0에서 제거된다. Cache Components에서는 use cache + cacheLife가 같은 역할을 맡고, 갱신은 revalidateTag/updateTag로 한다.

  • expire를 넘기면 그 요청은 기다린다cacheLife.md:93,127

    cacheLife는 stale · revalidate · expire 세 값을 갖는다. revalidate만 넘긴 상태에서는 구버전을 주고 뒤에서 갱신하지만, 트래픽이 없어 expire까지 넘기면 다음 요청은 동기 재생성을 기다린다. 이 데모가 그리는 "구버전 즉시 응답"은 revalidate ~ expire 구간의 이야기다.