리액트 서버 컴포넌트
Next.js에서 렌더링 작업은 라우트마다 분리되어 있어 streaming과 부분 렌더링이 가능하다.
기본적으로 Next.js는 서버 컴포넌트를 사용한다.
클라이언트 컴포넌트를 사용하려면 별도로 선언해야 한다.
서버에서, Next.js는 리액트 API를 사용하여 렌더링을 조정한다. 렌더링 작업은 개별 라우트와 서스펜스 기준으로 청크 단위로 분리된다.
각 chunk는 두 가지 단계로 렌더링된다:
1. 리액트는 서버 컴포넌트를 React Server Component Payload(RSC Payload)라 불리는 특별한 데이터 포맷으로 렌더링한다.
2. Next.js는 RSC Payload를 사용하고 클라이언트 컴포넌트는 서버에 HTML을 렌더링하기 위해 자바스크립트 명령어를 사용한다.
클라이언트에서는:
1. 비대화형(사용자랑 상호작용하지 않는) 경로의 미리보기를 즉시 보여주기 위해 HTML이 사용된다. -> 오직 initial page load를 위해서다.
2. 리액트 서버 컴포넌트 페이로드는 클라이언트 및 서버 컴포넌트 트리를 조정하기 위해 사용되고, DOM을 업데이트한다.
3. 자바스크립트 명령어는 클라이언트 컴포넌트를 hydrate하는 데에 사용되고 애플리케이션을 상호작용 가능하게 만든다.
React Server Component Payload(RSC)가 무엇인가
렌더링된 리액트 서버 컴포넌트 트리의 바이너리 표현이다. 브라우저의 DOM을 수정하기 위해 클라이언트의 React에서 사용된다.
RSC 페이로드 내용:
라우트가 빌드 타임에 렌더되거나 data revalidation 후에 백그라운드에서 렌더링된다. 결과가 캐싱되고 Content Delivery Network(CDN)에 넣을 수 있다.
-> 유저와 서버 요청 사이에 렌더링 동작의 결과를 공유할 수 있다.
라우트가 유저에 개인화되지 않은 데이터를 갖고 있고 빌드 타임에 알 수 있을 때 유용하다
라우트는 요청할 때 각각 유저에게 렌더링된다.
데이터가 유저에게 개인화된 데이터를 갖고 있거나 요청 타임에만 알 수 있는 정보를 갖고 있을 때 유용하다
렌더링 중에, 만약 Dynamic API 또는 fetch 옵션의 { cache: 'no-store' }이 발견되면 Next.js는 전체 라우트를 동적으로 렌더링하도록 바꾼다.

fully static 하려면 모든 데이터가 반드시 캐싱되어야 한다.
하지만 캐시된 그리고 캐싱 안 된 데이터 패치 둘 다를 사용하는 동적으로 렌더링된 라우트도 가질 수 있다.
Next.js는 기능과 사용된 API를 기반으로 라우트를 자동으로 최적의 렌더링 방법을 선택할 것이다.
대신 캐시된 또는 재검증한 특정 데이터를 선택할 때 UI의 어떤 부분을 stream 부분으로 둘 것인지 정해야 한다.
Dynamic API는 요청시에만 알 수 있는 정보에 의존한다.(미리 렌더링하는 중에는 알 수 없다.)
예시:

스트리밍은 서버로부터 UI를 점진적으로 렌더링할 수 있게 한다.
동작은 chunk 단위로 나누어져 있고 준비가 되면 클라이언트에게 stream 된다.
-> 모든 콘텐츠의 렌더링이 완료되기 전에 페이지의 부분이라도 즉시 볼 수 있게 한다.

스트리밍은 Next.js 앱 라우터에 기본적으로 탑재되어 있다.
loading.js와 React Suspense 컴포넌트를 사용해서 스트리밍 라우트 세그먼트를 시작할 수 있다.