nextJs 페이지 라우터 data-fetching

Posted by : on

Category : nextJs


데이터 페칭 (Data Fetching)

웹 애플리케이션에서 데이터를 가져오는 프로세스

Next.js는 다양한 데이터 페칭 방법을 제공.

서버에서 데이터를 가져와 페이지를 렌더링하거나, 클라이언트 측에서 데이터를 가져와 동적으로 페이지를 업데이트할 수 있음.

공식 문서: Next.js Data Fetching


주요 데이터 페칭 함수

getStaticProps:

빌드 시점에 필요한 데이터를 가져오는 함수

getStaticPaths:

동적 경로를 사용할 때, 필요한 경로의 목록을 동적으로 생성하는 함수

getServerSideProps:

매 요청마다 서버에서 필요한 데이터를 가져오는 함수

API Routes:

Next.js에서 엔드포인트를 생성/사용하여 데이터를 가져오는 방법


getStaticProps

정적 페이지 생성을 위한 데이터 가져오기 함수. 런타임이 아닌, 빌드(build) 타임에서만 실행이 되므로, 변동이 거의 없는 데이터 대상으로만 적용하는 게 좋음

예를 들어, 거의 변동이 없는 FAQ 글 목록을 가져올 때 사용됨

props로 넘겨서 페이지에서 사용 가능

export async function getStaticProps() {
const posts = await fetchPosts(); // 데이터 가져오기 함수
    return {
        props: {
        posts,
        },
        //isr을 사용하고 싶으면 5초마다 서버로 새 데이터를 요청함
        revalidate:5
};
}

언제 getStaticProps를 사용해야 할까?

  • 사전에 페이지를 미리 렌더링 할 때 ,데이터를 미리 fetch하고 싶을 때 사용 (빌드 타임에 실행됨)
  • 변동이 거의 없는 데이터 대상으로만 적용하는 것이 좋음. (단, 개발 모드에서는 항상 호출됨)
  • 데이터가 Headless CMS에서 온 경우 : 콘텐츠를 생성,저장,관리하는 콘텐츠관리 시스템만 제공하고 사용자들에게 콘텐츠가 보이는 부분은 api로 제공
  • 페이지를 렌더링하는 데 필요한 데이터를 사용자의 요청 전, ‘빌드’할 때 사용해야 하는 경우
  • SEO 최적화와 빠른 렌더링이 필요할 때
  • 렌더링이 매우 빨라야 하는 경우
  • getStaticProps는 성능을 위해 CDN에서 캐시할 수 있는 HTML 및 JSON 파일을 생성함.
  • 데이터를 공개적으로 캐싱할 수 있는지 여부

(user-specific X) 사용자별 데이터에는 적합하지 않음.


getStaticPaths:

동적 경로를 위한 정적 경로 생성 함수. 동적으로 생성되는 페이지를 사전 렌더링할 때 사용 예를 들어, 하나의 FAQ 데이터(id: 1)가 존재한다고 했을 때, faqs/1라는 경로를 빌드 타임에 미리 사전 렌더링할 수 있음

export async function getStaticPaths() {
const paths = await fetchDynamicPaths(); // 동적 경로 생성 함수
    return {
        paths,
        fallback: false, // 없는 경로는 404 페이지로 처리
        };
    }

언제 getStaticPaths를 사용해야 할까?

  • 특정 페이지의 경로(paths)가 외부 데이터에 의존할 때 getStaticPaths를 통해 사전 렌더링을 실행할 수 있음 예: Post 데이터 상세 페이지 (posts/1)와 같은 동적 경로를 사전에 렌더링

  • getStaticPaths는 런타임이 아닌 빌드 타임(Next.js 빌드)에서만 실행되므로, 변동이 거의 없는 데이터 대상으로만 적합 (단, 개발 모드에서는 항상 호출됨)
  • 동적 경로를 사용하는 페이지들을 사전 렌더링하고 싶을 때
    • 데이터가 Headless CMS나 파일 시스템에서 온 경우
    • 데이터가 데이터베이스에서 온 경우
    • 데이터를 공개적으로 캐시할 수 있는 경우 (user-specific X)
    • 페이지가 사전 렌더링 되어 SEO와 빠른 렌더링이 중요한 경우

getServerSideProps:

서버 사이드 렌더링을 위한 데이터 가져오기 함수. 매 요청마다 데이터를 서버에서 가져옴 ssr사용가능

예를 들어, 자주 업데이트 되는 posts 데이터를 외부 API로부터 fetch해서 사전 렌더링 하고 싶을 때 사용

import type { InferGetServerSidePropsType, GetServerSideProps } from 'next';

type Repo = {
  name: string;
  stargazers_count: number;
};

export const getServerSideProps: GetServerSideProps<{ repo: Repo }> = async () => {
  const res = await fetch('https://api.github.com/repos/vercel/next.js');
  const repo = await res.json();
  return { props: { repo } };
};

export default function Page({
  repo,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
  return <div>{repo.stargazers_count}</div>;
}

언제 getServerSideProps를 사용해야 할까?

getServerSideProps는 getStaticProps와 비슷하지만 서버 사이드 렌더링을 위한 함수

  • getStaticProps처럼 컴포넌트에 props를 넘겨준다는 공통점이 있지만, 빌드 시가 아닌 매 request마다 실행된다는 차이

예) 자주 업데이트 되는 데이터를 외부 API로부터 fetch해서 사전 렌더링 하고 싶을 때

사용해야 하는 경우

  • 매 요청마다 데이터를 가져와서 페이지를 렌더링해야 하는 경우 getServerSideProps를 사용
  • 요청 시 서버 측에서 렌더링 해당 페이지는 cache-control 헤더가 구성된 경우에만 캐싱됨

추천하지 않는 경우

만약 요청 중에 데이터를 렌더링할 필요가 없는 경우: 클라이언트 측에서 데이터를 가져오거나 getStaticProps를 통해 가져오는 것 권장

```


About 유재석
유재석

개발자 유재석 입니다. Web Developer.

Email : jaeseok9405@gmail.com

Website : https://github.com/yoo94