Next.js는 React 라이브러리의 프레임 워크이다
기존 리엑트에서는 기본적으로 클라이언트 사이드에서만 작동한다는 문제점이 있었는데, 이 클라이언트 사이드 렌더링(CSR)의 단점으로는 아래와 같습니다.
이 문제점을 개선하기 위해 웹 애플리케이션을 서버에서 미리 렌더링하는 방법 즉 서버 사이드 렌더링을 지원하는 Next.js가 등장하였습니다.
서버로부터 html파일을 받아 브라우저에 보여주는 과정이다.
렌더링 종류로는 서버 사이드 렌더링(SSR), 클라이언트 사이드 렌더링(CSR), 정적 사이트 생성 (SSG)등이 있다.
서버에서 보여질 HTML을 미리 렌더링해서 먼저 클라이언트(브라우저)에 전달하는 방식.
서버에서 렌더링한 페이지에 스크립트 코드를 집어 넣어서 나중에 웹 페이지를 동적으로 처리하는 방식.
만약 초기에 서버에서 HTML파일로 렌더링해서 먼저 보내준 뒤(프리렌더링) JS를 적용하는 방식(하이드레이션)을 사용한다면, SSR의 장점, CSR의 장점을 결합한 싱글 페이지 애플리케이션(SPA)처럼 작동할 수 있음.
쿠키 관리, 주요API, 데이터 검증 같은 작업등을 서버에서 처리하기 때문에 클라이언트에 노출할 필요가 없기 때문에 안전하다.
클라이언트 환경이 자바스크립트를 사용불가하거나 오래된 브라우저를 사용하더라도 웹페이지를 제공할 수 있다.
클라이언트에서 서버가 렌더링한 HTML콘텐츠를 받기 때문에 봇이나 웹 크롤러 같은 검색 엔진 웹 문서 수집기가 페이지를 렌더링할 필요가 없다. 그 결과로 웹 애플리케이션의 SEO점수가 높다.
페이지에 대한 요청을 처리하는 시간이 길어진다
웹 앱을 서버에 배포한다면 다른 방식보다 더 많은 자원을 소모하고 더 많은 부하를 보이며 유지보수 비용이 증가한다.
클라이언트가 렌더링을 처리하는 방식
useEffect를 리액트 하이드레이션 이후 브라우저에서 실행
process.broswer 변수는 Boolean 값으로, 코드를 클라이언트에서 실행될 때 "True" , 코드를 서버에서 실행한다면 "False"값을 가집니다.
이 변수를 사용하여 브라우저에서만 실행될 코드와 서버에서만 실행될 코드를 작성할 수 있습니다.
function IndexPage(){
const side = process.broswer ? `client' : 'server';
return <div> {side} </div>; // 클라이언트 에서 코드를 실행했다면 true / 서버에서 실행했다면 false 반환.
}
export default IndexPage
비슷하게 typeof window를 통해서도 서버에서 실행된 코드, 클라이언트에서 실행된 코드를 구별 할 수 있습니다.
function IndexPage(){
const side = typeof window === "undefined" ? `server' : 'client';
// typeof window를 서버에서 실행하면 그 값은 문자열 "undefined"가 되며, 그렇지 않으면 클라이언트에서 실행하는것을 알 수 있다
return <div> {side} </div>;
}
export default IndexPage
동적 임포트를 사용하면 Next.js는 해당 컴포넌트를 서버에서 렌더링하지 않고, 리액트 하이드레이션이 끝날 때 까지 기다려야 해당 컴포넌트를 사용할 수 있게 됩니다.
SSG는 빌드 시점에 미리 사전생성 페이지를 만들어 정적 페이지 형태로 보관하고있다가 클라이언트에서 페이지 요청 시 사전생성페이지를 로드하여 보여주는 방식
단점으로는 다음 배포전까지 내용 수정이 불가능합니다. 하지만 Next.js에서 제공되는 증분 정적 재생성(ISR)을 사용하면 어느정도 해결이 가능합니다.
ISR은 Next.js가 어느 정도의 주기로 정적 페이지를 다시 렌더링하고 해당 내용을 업데이트 할 지 정할 수 있는 기능입니다.
『실전에서 바로쓰는 Nextjs』 (미셀 라바, 박수현 / 한빛 미디어)