React · Streaming SSR

Streaming SSR with Suspense

두 레인이 같은 시간축을 공유합니다. 일괄 SSR은 2,150ms까지 이어지지만, 스트리밍 레인은 180ms에 완료 지점을 표시하고 나머지 구간은 스트림을 연 채 비워 둡니다.

0ms / 2,400ms
응답 차단서버 렌더네트워크 청크브라우저 페인트스트림 유지
첫 화면(FCP)2,150ms→180ms12× 빠름타임라인을 드래그하면 그 시각으로 이동합니다 · 블록에 마우스를 올리면 아래 설명과 연결됩니다

🔒 일괄 SSR — 전부 기다린다

2,150ms

서버가 셸과 추천 API를 한 덩어리로 처리한다. 가장 느린 fetch가 끝날 때까지 첫 바이트조차 나가지 못해, 사용자는 2초 내내 빈 화면을 본다.

  1. ①
    전체 대기0ms – 2,000ms

    셸 렌더와 추천상품 API(2초)가 하나의 응답에 묶여 있다. 빠르게 준비된 헤더·레이아웃도 함께 붙잡혀 전송되지 못한다.

  2. ②
    HTML 전송2,000ms – 2,090ms

    2초가 지난 뒤에야 완성된 HTML 문서 전체가 한 번에 전송된다.

  3. ③
    페인트2,090ms – 2,150ms

    브라우저가 페이지 전체를 한 번에 그린다. 이 순간이 곧 첫 화면이다.

  • 셸 표시 · 2,150ms 대기
  • 추천 영역 · 2,150ms 대기

⚡ Streaming SSR — 준비된 것부터

180ms

정적 셸을 먼저 flush 해 150ms 만에 스켈레톤을 띄우고, HTTP 스트림을 열어 둔 채 느린 청크가 도착하면 그 자리만 교체한다. 느린 API는 여전히 2초지만 첫 화면은 기다리지 않는다.

  1. ①
    셸 렌더0ms – 110ms

    헤더·네비게이션 등 데이터가 필요 없는 정적 셸을 먼저 만든다.

  2. ②
    셸 flush110ms – 150ms

    완성을 기다리지 않고 셸과 Suspense fallback을 먼저 내보낸다.

  3. ③
    스켈레톤150ms – 180ms

    브라우저가 셸과 로딩 스켈레톤을 180ms에 페인트한다. 여기서 첫 화면이 완성된다.

  4. ④
    스트림 유지180ms – 2,080ms

    연결을 끊지 않고 열어 둔다. 메인 스레드는 비어 있어 사용자 조작에 계속 반응한다.

  5. ⑤
    청크 도착2,080ms – 2,220ms

    느린 API가 끝나면 그 조각만 인라인 스크립트 청크로 스트리밍된다.

  6. ⑥
    UI 교체2,220ms – 2,300ms

    스켈레톤 자리에 실제 추천 카드가 끼워진다. 페이지 전체를 다시 그리지 않는다.

  • 셸 표시 · 180ms 대기
  • 추천 영역 · 2,300ms 대기