Skip to main content
Sonamu의 registerSSR를 사용하여 서버에서 데이터를 미리 로드하고 클라이언트로 전달하는 방법을 알아봅니다.

데이터 프리로딩 개요

registerSSR

라우트별 preload 설정 백엔드 직접 호출

SSRQuery

타입 안전한 쿼리 모델/메서드 지정

자동 주입

QueryClient에 자동 주입 Hydration 처리

No HTTP

네트워크 오버헤드 없음 빠른 응답

registerSSR 사용법

기본 구조

작동 과정:
  1. 서버에서 /users/123 요청 받음
  2. path 매칭: /users/:idparams = { id: "123" }
  3. preload 함수 실행 → SSRQuery[] 반환
  4. UserModel.getUser("C", 123) 백엔드 직접 호출 (HTTP 없음!)
  5. 결과를 QueryClient.setQueryData(["User", "getUser", "C", 123], result) 주입
  6. HTML + dehydratedState를 클라이언트로 전송
  7. 클라이언트가 hydrate하여 즉시 데이터 사용

SSRQuery 타입

중요: params백엔드 메서드의 파라미터 순서를 따릅니다 (Context 제외).

실전 예제

단일 데이터 로딩

사용자 상세 페이지에서 사용자 정보를 프리로드합니다.

여러 데이터 동시 로딩

게시글 상세 페이지에서 게시글과 댓글을 동시에 프리로드합니다.

파라미터 가공

URL 파라미터를 가공하여 사용할 수 있습니다.

조건부 프리로딩

특정 조건에 따라 다른 데이터를 로드할 수 있습니다.

쿼리 키 매칭

프리로드된 데이터가 클라이언트의 useQuery와 매칭되려면 queryKey가 정확히 일치해야 합니다.

올바른 매칭

잘못된 매칭

SSRRoute 옵션

disableHydrate

Hydration을 비활성화하고 클라이언트에서 새로 렌더링합니다.
사용 사례:
  • 서버/클라이언트 렌더링 결과가 다를 수 있는 경우
  • 실시간 데이터가 중요한 경우
  • Hydration mismatch 해결

cacheControl

SSR 응답의 Cache-Control 헤더를 설정합니다.

내부 동작 원리

1. 서버 렌더링 과정

2. entry-server에서 데이터 주입

3. 클라이언트 Hydration

에러 처리

프리로드 실패 처리

서버 로그:
개별 쿼리 실패는 전체 SSR을 중단시키지 않습니다. 실패한 데이터만 클라이언트에서 다시 로드됩니다.

성능 최적화

1. Subset 활용

필요한 필드만 로드하여 전송 크기를 줄입니다.

2. 병렬 로딩

여러 쿼리를 동시에 실행합니다 (자동으로 병렬 처리됨).

3. 조건부 로딩

필요한 데이터만 선택적으로 로드합니다.

주의사항

registerSSR 사용 시 주의사항: 1. queryKey 정확히 매칭: 서버와 클라이언트의 queryKey가 동일해야 함 2. params 순서 주의: 백엔드 메서드 파라미터 순서를 정확히 따라야 함 3. Context 제외: params에 Context는 포함하지 않습니다 4. 타입 변환 주의: parseInt(params.id) 등 타입 변환 필요 5. 에러는 로그로: 개별 쿼리 실패가 전체 SSR을 중단시키지 않음

다음 단계

SSR 설정

SSR 기본 구조

Hydration 전략

하이드레이션 최적화

캐시 제어

캐싱 전략

Subset System

데이터 최적화