본문 바로가기
카테고리 없음

Basic Features > Data Fetching 1 [공식 문서로 공부하는 Next.js]

by 룰루리랄라리 2022. 1. 7.

Data Fetching

Next.js는 pre-rendering 을 위해 데이터를 가져오는 방법으로 3가지 비동기 함수를 제공하고 있습니다.

  1. getStaticProps(정적 생성): 빌드 시 데이터를 가져옵니다.
  2. getStaticPaths(정적 생성): 데이터를 기반으로 페이지를 미리 렌더링하기 위한 동적 경로를 지정합니다.
  3. getServerSideProps(서버 측 렌더링): 각 요청에서 데이터를 가져옵니다.

getStaticProps(정적 생성)

페이지에서 getStaticProps라는 비동기 함수를 export 하는 경우 이 함수에서 반환되는 props를 사용하여 빌드 시 이 페이지를 pre-rendering 합니다.

!!) 이 함수 안에서는 내부 api호출을 위해 fetch를 사용하면 안됩니다. 대신 API 경로 내에서 사용되는 로직을 직접 가져오세요.

export async function getStaticProps(context) {
  return {
    props: {}, // props로 페이지 컴포넌트에 전달된다.
  }
}

 

context에는 params, preview, previewData, locale, locales, defaultLocale 를 포함하는 객체입니다.

  • params - 동적 경로를 사용하는 페이지에 대한 경로 매개변수를 포함합니다. ex)[id].js의 id
  • preview - 페이지가 preview mode이면 true, 아니면 정의되어있지 않습니다.
  • previewData - setPreviewData에 의해 설정된 미리보기 데이터를 포함합니다.
  • locale - 활성 로케일을 포함합니다(국제화 라우팅을 활성화한 경우).
  • locales - 지원되는 모든 로케일을 포함합니다(국제화된 라우팅을 활성화한 경우).
  • defaultLocale - 구성된 기본 로케일이 포함됩니다(국제화 라우팅을 활성화한 경우).

getStaticProps 반환할 때는 props, revalidate, notFound, redirect를 포함하는 개체를 반환해야합니다.

  • props - 페이지 구성 요소에서 수신할 props가 있는 선택적 개체입니다. 직렬화 가능한 객체여야 합니다.
  • revalidate - 페이지 재생성이 발생할 수 있는 초 단위의 선택적 양입니다. 기본값은 false입니다. false이면 재검증이 없음을 의미하므로 다음 빌드까지 페이지가 빌드된 상태로 캐시됩니다.
  • notFound - 페이지가 404 상태 및 페이지를 반환할 수 있도록 하는 선택적 boolean 값입니다.
export async function getStaticProps(context) {
  const res = await fetch(`https://.../data`)
  const data = await res.json()

  if (!data) {
    return {
      notFound: true,
    }
  }

  return {
    props: { data }, // will be passed to the page component as props
  }
}
  • redirect - 내부 및 외부 리소스로 리디렉션할 수 있는 선택적 리디렉션 값입니다. {destination: string, permanent: boolean}의 형태와 일치해야 합니다. next.config.js의 리디렉션과 유사하게 basePath: false를 설정할 수도 있습니다.
export async function getStaticProps(context) {
  const res = await fetch(`https://...`)
  const data = await res.json()

  if (!data) {
    return {
      redirect: {
        destination: '/',
        permanent: false,
      },
    }
  }

  return {
    props: { data }, // will be passed to the page component as props
  }
}

 

Example

아래 코드는 getStaticProps를 사용하여 콘텐츠 관리 시스템으로투버 블로그의 글 리스트를 가져옵니다.

// 게시물은 build time에 getStaticProps()에서 가져옵니다.
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>{post.title}</li>
      ))}
    </ul>
  )
}

// 이 함수는 서버 측에서 빌드할 때 호출됩니다.
// client-side에서는 호출되지 않으므로 직접 DB쿼리를 호출할 수 있습니다.
export async function getStaticProps() {
  // 외부 API를 호출하여 데이터를 가져옵니다.
  // fetch 말고 다른 라이브러리 사용이 가능합니다.
  const res = await fetch('https://.../posts')
  const posts = await res.json()

  //  { props: { posts } }를 return 하여 빌드 시 props로 받습니다.
  return {
    props: {
      posts,
    },
  }
}

export default Blog

댓글