export default function Page() {
return (
<h1>페이지 라우터 공부 6일차 🤓</h1>
);
}
페이지가 백엔드 서버로부터 특정 데이터를 불러와야 하는 페이지라면, 브라우저에 접속 요청이 들어올 때마다 사전 렌더링 과정에서 백엔드 서버에게 새로운 데이터를 요청하게 된다.
그래서 SSR은 페이지 내부 데이터를 항상 최신으로 유지할 수 있다는 장점이 있다. 하지만 백엔드 서버의 응답이 느려질 경우, 사용자에게는 이 기다림의 시간이 불편함이 되어버릴 수 있다는 치명적인 단점이 존재한다.
- SSR의 단점을 해결하는 사전 렌더링 방식.
- 빌드타임에 페이지를 사전 렌더링해둠.
➡️ 따라서 백엔드 서버로부터 데이터를 불러오는 과정이 오래 걸리더라도, 빌드 타임에 진행되기 때문에 사용자의 요청에는 매우 빠른 속도로 응답 가능하다!
- 하지만 정적 사이트 생성의 특성 상 매번 같은 페이지만 응답하기 때문에, 최신 데이터의 반영이 어렵다는 단점이 존재한다.
SSR에서 적용한 것을 다음과 같이 변경한다!
npm run build
dev
명령어가 아닌 build
명령어를 통해 결과를 터미널창에서 확인해보면, SSG를 적용한 index.tsx 파일만 채워진 흰색 동그라미로 표현되어 있는 것을 확인할 수 있다. (SSG) prerendered as static HTML (uses getStaticProps)
가 있는데, getStaticProps 함수를 통해 SSG가 잘 적용되고 있음을 확인할 수 있다. 검색 결과를 불러오는 페이지는 쿼리 q를 사용해야 하는데, SSG를 적용하면 쿼리를 사용할 수가 없다. (빌드 타임에 사전 렌더링을 진행하기 때문) 따라서 원래 리액트에서 사용하는 방식을 사용해야 함!
그래서 사전 렌더링 과정에서는 페이지의 레이아웃 정도만 렌더링되며, 컴포넌트의 마운트 이후 브라우저 측에서 컴포넌트가 다시 실행되면서 쿼리 스트링인 q에 알맞은 쿼리가 들어가 검색 페이지가 렌더링된다.
SSG를 적용하는 원래 방법을 동적 경로를 갖는 페이지에 적용한다면, 위와 같이 getStaticPaths라는 함수가 필요하다는 에러가 발생한다. 왜냐하면, SSG 방식은 빌드 타임에 정적으로 페이지를 생성해놓기 때문에! 따라서 사전 렌더링이 진행되기 전, 빌드 타임에 어떠한 경로들이 존재할 수 있는지 설정하는 작업이 필요하다. 위와 같이 미리 경로를 설정해주면, 사용자가 접속 요청을 보낼 때 미리 정해진 경로의 페이지를 요청하게 된다. 이와 같이 동적인 페이지에도 SSG 적용이 가능하다.
위와 같이
getStaticPaths
라는 함수를 생성하고, paths라는 property를 갖는 객체를 반환한다. URL 파라미터를 설정할 때는 규칙 상 반드시 문자열이어야 하며, 설정하지 않은 URL 파라미터로 접속 요청을 받을 시를 대비하여 fallback 키워드도 설정한다. 기본 값은 false이고, 404 Not found 페이지를 반환한다.
fallback 옵션에는 false / blocking / true, 이렇게 세 가지 옵션이 존재한다.
false
: 404 Not found 페이지를 반환. ➡️ 📁 404.tsxblocking
: 즉시 생성. true
옵션을 선택하면 된다! true
: 즉시 생성 + 페이지만 미리 반환.blocking
옵션의 장점과 더불어, 일단 사용자에게 긴 로딩 시간 대신 데이터가 없는 버전의 페이지라도 보여줄 수 있다는 장점이 존재.