NextJS의 렌더링 과정_클라이언트 컴포넌트와 서버 컴포넌트를 중심으로
· 약 6분
기본적인 웹사이트 렌더링 과정
기본적인 웹사이트의 렌더링 과정은 다음과 같다.
- 클라이언트에서 HTTP를 통해 서버로 데이터를 요청한다.
- 서버는 요청에 따라 데이터를 처리하여 HTTP로 응답한다.
- 클라이언트는 응답받은 리소스를 파싱하여 인터페이스를 렌더링한다.
하지만 NextJS는 서버사이드렌더링에 좀 더 최적화된 렌더링을 가지고 있는데, NextJS에서는 클라이언트 컴포넌트와 서버 컴포넌트의 경계를 나누어 각각 다른 렌더링 과정을 거친다. 이번 포스팅에서는 서버 컴포넌트와 클라이언트 컴포넌트의 렌더링 과정에 대해 공식문서를 바탕으로 정리하였다.
⚙️ NextJS의 렌더링 과정
🏢 서버 컴포넌트 렌더링 과정
Server Componets는 경로(route)와 서스펜스 Boundary에 따라 청크로 분할되는데, 분할된 각각의 청크는 다음의 두가지 단계를 거쳐 렌더링된다.
- 리액트에서 Server Components를 RSC 으로 렌더링한다.
- Next.js에서 RSC와 클라이언트 컴포넌트의 JavaScript를 통해 서버에서 HTML을 렌더링한다.
✅ RSC(React Sever Components Payload)란? 렌더링된 React Server Components 트리의 이진표현으로 다음과 같은 정보가 담겨있다.
- 서버 컴포넌트의 렌더링 결과
- 클라이언트 컴포넌트가 렌더링 될 곳의 Placeholder와 자바스크립트 파일의 참조
- 서버 컴포넌트에서 클라이언트 컴포넌트로 전달할 모든 데이터
이후 클라이언트 환경에서 다음과 같은 작업을 거친다.
- 초기 페이지를 불러오는 상황(Full page load)이라면 상호작용할 수 없는 미리보기를 즉시 보여준다. (React가 직접 제어하지는 않는 HTML)
- RSC로 클라이언트와 서버 컴포넌트 트리를 조정하고 DOM을 업데이트 하여 보여준다.
- 이후 JavaScript를 사용하여 hydrate를 통해 앱(Application)을 상호작용할 수 있도록 만든다.
서버 컴포넌트 렌더링 전략
서버 컴포넌트를 렌더링 할 때에는 다음과 같은 전략을 선택할 수 있다.