Next.js의 데이터 패칭은 React와 달리, 클라이언트 측에서만 데이터를 가져오는 것이 아닌 사전 렌더링(Pre-rendering) 과정에서 서버 혹은 빌드 시점에 데이터를 미리 가져와 HTML에 포함하는 방식.
Next.js는 데이터의 성격과 변경 빈도에 따라 데이터를 미리 가져오는 3가지 핵심 사전 렌더링 전략 제공.
서버 사이드 렌더링 (SSR, Server-Side Rendering):
getServerSideProps 함수 사용.정적 사이트 생성 (SSG, Static Site Generation):
getStaticProps 함수 사용.증분 정적 재생성 (ISR, Incremental Static Regeneration):
getStaticProps 내 revalidate 옵션 사용.revalidate 값)이 지나면 첫 사용자 요청에 의해 백그라운드에서 페이지 재생성.데이터 패칭 함수는 페이지 컴포넌트 파일 내에서만 사용 가능하며, export 필수.
export async function getServerSideProps(context) {
// context에 요청 정보(req, res, query 등) 포함
const res = await fetch(`API_ENDPOINT/data`);
const data = await res.json();
return {
props: { data }, // 페이지 컴포넌트로 전달
}
}
export async function getStaticProps() {
const res = await fetch(`API_ENDPOINT/data`);
const data = await res.json();
return {
props: { data },
// ISR 설정: 60초마다 재생성 시도
// revalidate: 60
}
}
export async function getStaticPaths() {
// 사전 생성할 페이지의 모든 경로(paths) 지정
return {
paths: [
{ params: { id: '1' } },
{ params: { id: '2' } },
],
fallback: false, // paths에 없는 요청에 대한 처리 (true, false, 'blocking')
}
}
getServerSideProps나 getStaticProps 내부에서 브라우저 전용 API(예: window, document) 사용 시 에러 발생. 해당 함수는 서버나 빌드 환경에서 실행되기 때문.getServerSideProps나 getStaticProps를 페이지 컴포넌트가 아닌 일반 컴포넌트에서 정의 시 무시되거나 오작동 유발. 반드시 페이지 레벨 컴포넌트 파일 내에서 export 필요.getStaticPaths의 fallback 미고려: 동적 SSG(예: /posts/[id])에서 getStaticPaths 사용 시, paths에 명시되지 않은 경로에 대한 처리(fallback: true | 'blocking')를 설정하지 않으면 빌드 후 해당 페이지 접속 불가.핵심 요약
- 사전 렌더링: Next.js는 데이터 패칭을 사전 렌더링 시점으로 앞당겨 초기 로딩 속도 및 SEO 성능 개선.
- 세 가지 전략: 데이터 성격에 따라 SSR (매 요청 시), SSG (빌드 시), ISR (주기적 재생성) 중 선택 사용.
- 함수 위치: 데이터 패칭 함수는 페이지 컴포넌트 내에서만
export하여 사용 가능.
출처: 한 입 크기로 잘라먹는 Next.js(v15)