next15, react19에서 useSearchParams을 사용할때 Suspense가 없으면 빌드 에러가 발생하는 이유
5/18/2025
Next.js 15 및 React 19 환경에서 useSearchParams를 사용할 때 Suspense로 감싸지 않으면 빌드 에러가 발생하는 주된 이유는 클라이언트 사이드 렌더링(CSR) 최적화 및 사용자 경험 관리와 관련이 깊습니다.
useSearchParams와 Suspense의 관계
-
useSearchParams의 클라이언트 측 동작 useSearchParams 훅은 URL의 쿼리 문자열(search parameters)을 읽어오는 클라이언트 컴포넌트 훅입니다. 이 훅을 사용하는 컴포넌트는 렌더링 시점에 해당 파라미터 값에 의존하게 됩니다.
-
Suspense 부재 시 발생하는 문제
전체 페이지 CSR 전환: Suspense 경계 없이 useSearchParams를 사용하면, Next.js는 해당 훅을 사용하는 페이지 전체를 클라이언트 사이드 렌더링(CSR)으로 처리하게 됩니다. 이는 서버 사이드 렌더링(SSR)이나 정적 사이트 생성(SSG)의 이점을 활용하지 못하게 만들어 초기 로딩 성능에 영향을 줄 수 있습니다.
초기 로딩 시 빈 페이지 노출: 클라이언트 측 JavaScript가 로드되고 실행되어 쿼리 파라미터를 읽고 컴포넌트를 렌더링할 때까지 페이지가 비어 있거나, 불완전하게 보일 수 있습니다. 이는 사용자 경험에 부정적인 영향을 미칩니다.
React의 렌더링 일시 중단: React는 useSearchParams와 같이 데이터에 의존하는 훅을 만나면, 가장 가까운 Suspense 경계까지 렌더링을 "일시 중단(suspend)"합니다. Suspense 경계가 없다면 이 중단 상태를 적절히 처리할 수 없어 빌드 시점에서 오류를 발생시키거나 런타임 문제를 야기할 수 있습니다.
- Next.js와 React의 설계 의도
점진적 로딩과 최적화: Next.js는 페이지 로딩 성능과 사용자 경험을 최적화하기 위해, useSearchParams처럼 동적인 데이터에 의존하는 부분만 지연 로딩하고 나머지 정적인 부분은 빠르게 사용자에게 보여주는 방식을 권장합니다.
Suspense의 역할: React 18에 도입된 Suspense는 데이터 가져오기와 같은 비동기 작업이 완료될 때까지 로딩 상태(fallback UI)를 보여주다가, 데이터가 준비되면 실제 UI로 전환하는 기능을 제공합니다.
강제적인 Suspense 사용: useSearchParams를 사용하는 컴포넌트나 그 상위 컴포넌트를 Suspense로 감싸도록 강제함으로써, 해당 부분의 렌더링이 지연되더라도 페이지의 다른 부분은 영향을 받지 않고 먼저 렌더링될 수 있도록 합니다. 이는 페이지 전체가 CSR로 전환되는 것을 방지하고, 더 나은 사용자 경험과 성능을 제공하기 위함입니다.
- 빌드 에러 발생 이유 Next.js는 이러한 최적화와 사용자 경험을 강제하기 위해, 빌드 과정에서 useSearchParams가 Suspense 경계 내에 위치하지 않으면 이를 감지하고 오류를 발생시킵니다. 이는 개발자가 의도치 않게 전체 페이지를 CSR로 만들거나 로딩 상태 처리를 누락하는 것을 방지하기 위한 조치입니다. 즉, Suspense를 사용하지 않으면 페이지가 클라이언트 측 JavaScript가 로드될 때까지 비어 있을 수 있기 때문에 빌드 시점에서 에러를 발생시키는 것입니다.
결론적으로, useSearchParams 사용 시 Suspense를 요구하는 것은 Next.js와 React가 지향하는 점진적 로딩과 최적화된 사용자 경험을 보장하기 위한 설계적 결정입니다. 이를 따르지 않을 경우, 빌드 시스템에서 에러를 발생시켜 올바른 패턴을 사용하도록 유도합니다.