> Ensure that calls to `useSearchParams()` are wrapped in a Suspense boundary.
https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout
Missing Suspense boundary with useSearchParams
Using App Router Features available in /app
nextjs.org
빌드 에러가 발생했다.
친절하게 해결방법까지 알려준다.
Reading search parameters through useSearchParams() without a Suspense boundary will opt the entire page into client-side rendering. This could cause your page to be blank until the client-side JavaScript has loaded.
상위 (부모) 컴포넌트에서 Suspense로 감싸주어야 한다.
import { Suspense } from "react";
...
return (
<Suspense fallback={<LoadingSpinner />}>
<div>
{children}
</div>
</Suspense>
)
useSearchParams 를 사용해 param을 가져오는 경우 suspense가 요구된다
클라이언트 사이드 자바스크립트 로드가 비동기적으로 진행되는 동안 fallback 에 전달한 JSX가 렌더된다.
항상 Suspense가 필요한건 아니다!
useSearchParams()는 클라이언트 사이드 렌더링(CSR)을 사용하는 React 훅입니다. 이 훅은 URL의 쿼리 문자열을 읽고 이를 통해 검색 매개변수를 가져옵니다. Next.js와 같은 프레임워크에서 이 훅을 사용할 때, 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR) 간의 차이점으로 인해 Suspense 경계가 필요합니다.
왜 Suspense가 필요한가요?
- CSR에서 비동기 데이터 처리: useSearchParams()는 기본적으로 클라이언트에서 실행되는 훅으로, 서버 측에서는 검색 매개변수를 알 수 없으므로 클라이언트에서만 유효합니다. 페이지가 로드될 때 서버에서는 해당 데이터가 없다가, 클라이언트에서 JavaScript가 실행되면서 데이터를 가져오기 때문에, 초기 렌더링은 데이터가 없는 상태에서 이루어집니다. 이런 비동기 데이터 처리에서 Suspense는 데이터를 기다리는 동안 fallback UI를 제공하도록 도와줍니다.
'개발개발 > WorkRoot_워크루트' 카테고리의 다른 글
어이없는 실수 2 - API 요청 시 Swagger 를 잘 보자 !! (1) | 2025.01.13 |
---|---|
어이없는 실수 1 - 커스텀 훅에서 함수, 변수 가져올때 구조분해 할당하기 (This expression is not callable) (0) | 2025.01.13 |
리액트 훅 폼 (React Hook Form) 트러블 슈팅 2 - 여러 유형의 폼 데이터 제출하기 (0) | 2025.01.09 |
리액트 훅 폼 (React Hook Form) 트러블 슈팅 1 - 여러 탭에 걸친 폼 데이터 제출하기(watch, setValue 사용하기, getValues) (0) | 2025.01.03 |
데이터 피커 (react-datepicker) 달력 UI 커스텀하기 (0) | 2025.01.03 |