Inflearn brand logo image

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

JIN LEE님의 프로필 이미지
JIN LEE

작성한 질문수

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

6.1) 스트리밍이란?

suspense관련 질문 있습니다! 섹션6 5.2풀 라우트 캐시2강의

해결된 질문

작성

·

128

·

수정됨

0

안녕하세요! 강의 잘 듣고 있습니다! suspense태그 관련 질문이 있습니다! 5.2 풀 라우트 캐시2 강의에서 저희가 useSearchParams() 훅이 빌드타임에서 실행되는 오류를 없애기 위해 <SearchBar/ > 컴포넌트를 suspense로 감싸잖아요 이때 강의 4분45초 쯤에서 사전 suspense를 사용해서 이제 사전 렌더링 과정에서 완전히 배제한다고 하셨는데, 그러면 페이지를 만들때 suspense로 감싼 컴포넌트는 nextjs app router방식이 아니라 csr방식으로 구현이 되는건가요 나머지 컴포넌트들만 approuter의 사전 렌더링 방식으로 구현이 되는건가요?? 제가 정리했을땐 동적 페이지도 정적 페이지도 사전렌더링의 시점은 다르지만 (요청할때, 빌드할때) 사전렌더링이라는 기능은 nextjs에서 기본으로 작동한다고 알고 있습니다! 그래서 사전렌더링에서 완전 배제된다는 부분이 헷갈려서 질문 남깁니다!

답변 3

1

JIN LEE님의 프로필 이미지
JIN LEE
질문자

아 넵 답변 감사합니다!! 그러니까 Searbar component가 사전렌더링에서 완전 배제되는 이유는 suspense 때문이 아닌 useSearchParams 훅 때문인 거군요! suspense는 뒤에 강의에서 나온대로 fallback을 통해 대체 html을 보여줄 수 있고 데이터를 순차적으로 전달해준다고 그대로 이해하면 되겠네요

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

넵! 정확히 이해하셨습니다 😃 더 엄밀히 설명하자면 Searchbar가 아닌 일반적인 서버 컴포넌트 또한 사전 렌더링에서는 Suspense로 감쌀 경우 동일하게 배제됩니다. fallback Props로 전달한 요소가 대신 렌더링 되니까요

여기서 중요한건 클라이언트 사이드에서 뒤늦게 렌더링 되느냐, 서버 사이드에서 뒤늦게 렌더링 되느냐의 차이인데요 Searchbar 컴포넌트의 경우 클라이언트 컴포넌트이며 useSearchParams라는 비동기 작업을 가지고 있어 클라이언트 사이드에서 뒤늦게 렌더링 되지만, 일반적인 서버 컴포넌트의 경우 서버 사이드에서 뒤늦게 렌더링되어 RSC Payload 형태로 브라우저에게 전달됩니다.

결론적으로 Suspense로 감싸진 컴포넌트는 다 사전 렌더링에서는 배제된다는 사실, 그러나 이후 서버사이드에서 뒤늦게 해당 컴포넌트를 렌더링 할것인지, 클라이언트 사이드에서 뒤늦게 렌더링 할 것인지의 차이라고 이해하시면 좋을 것 같습니다 👍

1

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

안녕하세요 이정환입니다.

결론부터 말씀드리면 Searchbar 컴포넌트의 경우 클라이언트 사이드 렌더링으로 화면에 나타나지만, Suspense로 감싼 모든 컴포넌트들이 그렇게 동작하는건 아닙니다.

Searchbar 컴포넌트의 경우 애초에 클라이언트 컴포넌트이며, 또 Suspense 컴포넌트를 대기시키는 useSearchParams가 클라이언트 사이드 렌더링이 완료된 이후에 동작을 마치는 비동기 함수이기 때문에 딱 이 상황에는 Searchbar 컴포넌트가 서버 측 렌더링 과정에서는 아예 배제된다고 이해하시면 될 것 같습니다.

만약 Searchbar 같은 클라이언트 컴포넌트가 아니라 백엔드 서버로부터 특정 데이터를 불러오는 서버 컴포넌트를 Suspense로 감싼다면 이 컴포넌트는 초기 접속 시에 진행되는 사전 렌더링 과정에서는 배제(fallback Props로 전달된 HTML로 대체)되지만, 이후에 서버측에서 비동기적으로 렌더링을 진행하여 결과를 RSC Payload 형태로 보내주게 됩니다.

즉 정리하자면 Seachbar 컴포넌트의 경우, 클라이언트 사이드에서만 작업이 완료되는 useSearchParams 라는 Hook을 호출하고 있기 때문에 서버측에서는 절대 이 작업을 완료할 수 없습니다. 따라서 이 경우에만 클라이언트 측에서 렌더링 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. JIN LEE님께서 Suspense와 관련된 질문을 주셨군요. 이 주제는 Next.js에서의 렌더링과 관련된 중요한 개념입니다.

Suspense와 Next.js의 렌더링 원칙

Next.js에서의 Suspense는 비동기적으로 데이터를 가져올 때 로딩 상태를 처리하는 데 도움을 줍니다. 특정 컴포넌트를 Suspense로 감싼다는 것은 그 컴포넌트의 렌더링이 데이터를 기다리는 동안 지연될 수 있음을 의미하되, 이는 CSR(클라이언트 사이드 렌더링) 방식으로 전환되는 것은 아닙니다.

다만, Suspense로 감싼 컴포넌트는 사전 렌더링 시점에서 데이터 로딩이 완료되지 않았기 때문에 해당 부분은 사전 렌더링에 포함되지 않습니다. 이로 인해 이러한 특정 부분은 CSR 방식처럼 동작할 수도 있습니다. 하지만 전체 페이지가 CSR로 전환되지 않고, 단지 해당 컴포넌트가 CSR처럼 클라이언트에서 데이터를 로드하고 렌더링하게 됩니다.

사전 렌더링과 Dynamic/Static 페이지의 차이

  • 정적 페이지(Static Page): 빌드 시에 사전 렌더링하여 생성된 HTML 파일이 저장되어 클라이언트 요청 시 사용됩니다. Suspense로 감싸지 않은 부분이 주로 여기 해당합니다.
  • 동적 페이지(Dynamic Page): 요청 시점에 서버에서 렌더링됩니다. Suspense로 감싸진 컴포넌트는 이 범주에 더 가깝게 동작하여 레이아웃의 일부가 클라이언트 렌더링으로 처리될 수 있습니다.

요약하면, Suspense를 사용하는 경우에도 Next.js의 효율적인 렌더링 방식을 최대한 활용하면서 필요한 부분만 CSR로 동작하도록 만들 수 있는 것입니다.

JIN LEE님께서 궁금해하셨던 부분에 대한 Justin Pearse의 대답도 참조하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

JIN LEE님의 프로필 이미지
JIN LEE

작성한 질문수

질문하기