Partial Prerendering (PPR)
정적 셸은 20ms에 페인트되어 완료 지점이 시간축 맨 왼쪽에 표시됩니다. 동적 홀은 그 뒤 350ms부터 스트리밍되지만 첫 화면은 이미 표시됩니다. Next 16에서는 cacheComponents: true가 이 동작을 활성화합니다. experimental.ppr은 16에서 제거됐습니다.
🔒 전통적 동적 라우트 — 통째로 동적
430ms쿠키를 한 줄 읽었다는 이유로 페이지 전체가 동적으로 분류된다. 바뀌지 않는 헤더·상품 정보까지 매 요청마다 서버에서 다시 만든다.
- ①전체 동적 렌더0ms – 400ms
셸 + 쿠키 조회 + 장바구니 조회를 매 요청마다 함께 계산한다. 캐시할 수 있는 부분까지 400ms를 기다린다.
- ②전송400ms – 420ms
연산이 모두 끝난 뒤 완성된 HTML을 전송한다.
- ③페인트420ms – 430ms
첫 픽셀이 430ms에야 나타난다.
- 첫 Paint · 430ms 대기
⚡ PPR — 정적 셸 먼저, 홀은 나중에 (cacheComponents)
20ms빌드 타임에 만든 정적 셸이 CDN에서 20ms 만에 페인트되고, 동적인 장바구니 구멍(Hole)만 같은 응답 안에서 뒤이어 스트리밍된다. Next 16에서는 next.config의 cacheComponents: true가 이 동작을 켠다 — experimental.ppr 플래그와 세그먼트 옵션 experimental_ppr은 16에서 제거됐다.
- ①CDN 셸0ms – 14ms
빌드 시 생성된 정적 셸을 CDN 캐시에서 그대로 꺼낸다. 업스트림 서버를 타지 않아 서버 연산이 0이다. (Edge Runtime과는 다른 이야기다 — 그 런타임은 16에서 deprecated다)
- ②셸 페인트14ms – 20ms
20ms에 레이아웃·상품 정보가 화면에 나타난다. 여기가 첫 Paint다.
- ③홀 대기20ms – 350ms
장바구니 자리에는 fallback이 놓여 있고, 그동안 화면은 이미 조작 가능하다.
- ④동적 홀350ms – 440ms
쿠키가 필요한 장바구니 조각만 서버에서 계산해 스트리밍한다.
- ⑤홀 채움440ms – 480ms
fallback 자리에 실제 장바구니가 끼워진다.
- 첫 Paint · 20ms 대기
- 장바구니 · 480ms 대기
같은 그룹의 다른 시각화
Streaming SSR with Suspense
React · Streaming SSR일괄 SSR과 스트리밍의 첫 화면 표시 시점을 비교합니다.
Selective Hydration
React · Selective Hydration일괄 수화와 선택적 수화에서 클릭이 처리되는 시점을 비교합니다.
Concurrent Transitions
React · Transitions동기 렌더링과 작업을 나누는 렌더링의 입력 지연을 비교합니다.
Optimistic UI (Server Actions)
React · Optimistic UI서버 응답을 기다리는 UI와 먼저 반영하는 낙관적 UI를 비교합니다.
ISR Stale-While-Revalidate
Next.js · Caching재생성을 기다리는 응답과 기존 값을 먼저 반환하는 응답을 비교합니다.