강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

wl990님의 프로필 이미지
wl990

작성한 질문수

한 입 크기로 잘라먹는 Next.js(v15)

6.3) 스트리밍 2. 컴포넌트 스트리밍 적용하기

6.3 ~ 6.4 search 페이지에서 문제가 있습니다.

해결된 질문

작성

·

92

0

import BookItem from "@/app/components/book-item";
import BookListSkeleton from "@/app/components/skeleton/book-list-skeleton";
import { fetchSearchBooks } from "@/app/lib/fetch-search-books";
import { Suspense } from "react";

// export const dynamic = "force-dynamic";
// 특정 페이지 유형을 강제로 설정하는 dynamic 세그먼트 옵션
// 1. auto - 아무것도 강제하지 않는 옵션, 기본형
// 2. force-dynamic - dynamic 페이지를 강제하는 옵션
// 3. force-static - static 페이지를 강제하는 옵션
// 4. error - static 페이지를 강제하지만 이로 인해 오류가 발생할 것으로 예상되면 빌드과정에서 오류를 발생하는 옵션

async function SearchResult({ q }: { q: string }) {
  const searchBooks = await fetchSearchBooks(q);
  return (
    <>
      {searchBooks.map((book) => {
        return <BookItem key={book.id} {...book} />;
      })}
    </>
  );
}

export default async function Page({
  searchParams,
}: {
  searchParams: { q?: string };
}) {
  return (
    <Suspense fallback={<BookListSkeleton count={3} />}>
      <SearchResult q={searchParams.q || ""} />
    </Suspense>
  );
}

스켈레톤 UI를 적용하고 있는데 속도를 3g로 하고 새로고침을 해도 Suspence가 작동하지 않고 페이지가 랜더링 됩니다.
그리고 터미널에서 이런 에러가 발생하고 있습니다.

Error: Route "/search" used `searchParams.q`. `searchParams` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at Page (src/app/(with-searchbar)/search/page.tsx:31:37)
  29 |   return (
  30 |     <Suspense fallback={<BookListSkeleton count={3} />}>
> 31 |       <SearchResult q={searchParams.q || ""} />
     |                                     ^
  32 |     </Suspense>
  33 |   );
  34 | }
 GET /search?q=%ED%95%9C 200 in 47ms

SearchResult가 서버 컴포넌트로 만들어져 있어서 서버에서 이미 만들어 가져오기 때문에 fallback이 적용되지 않는건가요? SearchResult를 클라이언트 컴포넌트로 바꿔야지 해결되는 문제인가요?

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 이정환입니다

오류 메세지를 읽어보시면 searchParams 라는 Props의 타입 정의가 잘못되었다고 나와 있습니다.

이런 오류가 발생하는 이유는 우리 강의의 3.2) 페이지 라우팅 설정하기 6분 21초 경에 설명 드리고 있듯이 Next.js 15.1 버전부터는 searchParams와 params의 타입이 모두 Promise로 래핑되어 제공되기 때문입니다. (자세한 내용은 앞서 언급해드린 챕터를 참고하세요!)

이에 해당 내용을 참고하셔서 코드 상에 serachParams와 params의 타입을 모두 Promise로 변경하시면 되겠습니다!

0

wl990님의 프로필 이미지
wl990
질문자

아! 속도는 제가 delay 로직을 안 넣었어서 3g로 설정해도 금방금방 랜더링 되어서 안보이던 거였습니다!
그런데 저 터미널 오류는 계속해서 보이는데 무슨 문제인지 모르겠습니다 ㅠ

 

wl990님의 프로필 이미지
wl990

작성한 질문수

질문하기