Streaming & Suspense

Streaming SSR과 Suspense를 활용하여 점진적으로 UI를 렌더링합니다. 페이지를 새로고침하여 로딩 과정을 확인하세요.

← App Router 예제로 돌아가기

🌊 Streaming이란?

모든 데이터가 준비될 때까지 기다리지 않고, 준비된 부분부터 순차적으로 전송합니다.

✓ 초기 로딩 시간 단축 (TTFB 개선)
✓ 사용자는 빠르게 콘텐츠를 볼 수 있음
✓ SEO에도 유리 (점진적 렌더링)

📦 Suspense 경계로 분리된 컴포넌트들

각 컴포넌트는 서로 다른 속도로 로드됩니다. Suspense를 사용하여 독립적으로 스트리밍됩니다.

데이터 (500ms 지연)

이 데이터는 500ms 후에 로드되었습니다.

빠르게 표시됨

🕐 데이터 (1500ms 지연)

이 데이터는 1500ms 후에 로드되었습니다.

중간 속도로 표시됨

🐌 데이터 (3000ms 지연)

이 데이터는 3000ms 후에 로드되었습니다.

천천히 표시됨

🔄 Streaming SSR 동작 방식

1.
초기 HTML 전송: 즉시 사용 가능한 부분의 HTML을 먼저 전송
2.
Suspense 경계 인식: 로딩 중인 부분은 fallback UI로 대체
3.
점진적 렌더링: 데이터가 준비되는 대로 HTML 청크를 스트리밍
4.
hydration: 클라이언트에서 인터랙티브하게 전환

⚙️ Suspense 사용 패턴

<Suspense fallback={<Loading />}>
  <AsyncComponent />
</Suspense>

// 중첩된 Suspense
<Suspense fallback={<PageLoading />}>
  <Header />
  <Suspense fallback={<ContentLoading />}>
    <MainContent />
  </Suspense>
  <Footer />
</Suspense>
각 Suspense 경계는 독립적으로 스트리밍됩니다.

📊 전통적 SSR vs Streaming SSR 비교

특성전통적 SSRStreaming SSR
데이터 로딩모든 데이터를 기다림준비된 것부터 전송
TTFB느림 (모든 데이터 대기)빠름 (즉시 전송 시작)
사용자 경험긴 백화면점진적 표시
느린 API 영향전체 페이지 지연해당 부분만 지연
SEO완전한 HTML점진적이지만 완전함

✅ Streaming 사용 시나리오

  • 대시보드: 각 위젯이 독립적으로 로드
  • 상품 목록: 추천/리뷰/상세정보 별도 로딩
  • 소셜 피드: 포스트가 준비되는 대로 표시
  • 검색 결과: 필터/결과/광고 별도 스트리밍

💡 Best Practices

  • 중요한 콘텐츠는 상단에 배치
  • 의미 있는 로딩 상태 제공
  • 너무 많은 Suspense 경계는 피하기
  • layout shift 최소화 (스켈레톤 크기)