Streaming + Suspense — 페이지를 한 덩어리가 아니라 부분부분 전송
Streaming + Suspense — 페이지를 한 덩어리가 아니라 부분부분 전송
💡 왜 배워야 할까요? — 가장 느린 fetch 가 페이지 전체를 막는다
Suspense 경계 · loading.tsx · 점진 스트리밍
1. Suspense 경계의 작동 원리
- ▸Header 는 즉시 HTML 로 전송.
- ▸Reviews·Recommend 자리는 fallback 으로 채움.
- ▸각 컴포넌트의 fetch 가 끝나면 그 자리에 HTML 이 추가 스트리밍됨 (closing
</html>후에도 추가 가능).
2. loading.tsx — 폴더 단위 자동 Suspense
페이지 단위로 로딩 처리하는 가장 빠른 방법. 별도 import 불필요.
3. 명시적 vs loading.tsx
실무에서는 둘 다 함께 사용. loading.tsx 로 큰 그림, 페이지 안에서
4. 점진 스트리밍의 가시적 효과
사용자: '뭔가 빠르게 뜨네' (Header 0.1초) → '아 리뷰 떴네' (0.3초) → '추천도 뜸' (1초). 옛 방식이면 1초 빈 화면 후 한 번에 다 뜨는 것 대신.
5. waterfall 회피 — 병렬 fetch + 병렬 Suspense
6. 에러 경계와 짝 — error.tsx
App Router 에서는 error.tsx 가 자동으로 ErrorBoundary 역할.
💡 💡 Streaming + Suspense 실전 5
1. loading.tsx 는 페이지 전체,
페이지의 90% 가 데이터 대기면 loading.tsx 로 충분. 일부만 느리면
2. async Server Component 만 Suspense 가 잡는다
Client Component 의 useState 데이터는 Suspense 가 안 잡음 (그건 useTransition / useDeferredValue 영역).
3. Suspense 안에서 await 은 자동 throw → React 가 잡음
명시적 throw·try/catch 불필요. async function 그대로 작성.
4. waterfall 회피 — 각 컴포넌트가 자체 fetch
부모에서 모든 데이터 모은 후 자식에 props 로 내리면 waterfall 발생. 각 컴포넌트가 자기 데이터 fetch 하면 React 가 병렬 처리.
5. Suspense 경계는 ErrorBoundary 와 짝
await 가 reject 되면 ErrorBoundary 가 잡음 — Suspense 안이 아니라 바깥. App Router 의 error.tsx 가 자동.