Link Search Menu Expand Document

서버에서 데이터 불러오기

정적 생성

빌드 시에 페이지를 HTML로 만들어 요청 시 제공
외부 데이터를 필요로 하지 않을 때

서버 사이드 렌더링

페이지 요청 시 서버 사이드 렌더링을 통해 HTML을 제공
외부 데이터를 필요로 할 때

서버에서 데이터를 패치하기 위해 isomorphic-unfetch 또는 axios 설치

getServerSideProps

  • 서버 측에서 props를 받아오는 기능
  • 페이지를 요청시마다 실행이 되며 getServerSideProps에서 페이지로 전달해 준 데이터를 서버에서 렌더링 함

pages/dynamic/[key].js

import fetch from 'isomorphic-unfetch';

const App = ({ obj }) => {
    const value = obj?.key;
    return <div>{value}</div>
}

export const getServerSideProps = async ({ query }) => {
    const value = query.key;
    try {
        const result = await fetch(`[api]?key=${value}`);
        if (result.status === 200) {
            const obj = await result.json();
            return {props : {obj}};
        }
        return {props : {}};
    } catch (e) {
        console.error(e);
        return {props : {}};
    }
}

export default App;
  • 리턴한 props 값들이 페이지의 props로 전달되게 됨
  • 파일명의 [key]값은 매개변수 값인 query로 받아올 수 있음

getStaticProps

  • 빌드 시에 데이터를 불러와 결과를 json으로 저장하여 사용 -> 일관된 데이터
  • 정적 페이지에서 사용

pages/static.js

const Static = ({ time }) => {
    return <div>{time}</div>
}
export const getStaticProps = async () => {
    return {props : {time : new Date()}, revalidate : 5};
    // revalidate 값을 전달해 주면 정해진 시간마다 요청이 들어오면 데이터를 갱신(초 단위)
}
  • 동적 페이지에서 사용

pages/dynamic/[key].js

const fetch from 'isomorphic-unfetch';

const App = ({ obj, time }) => {
    const value = user?.key;
    return (
        <div>
        {value}, {time}
        </div>
    )
}

export const getStaticProps = async ({ params }) => {
    try {
        const result = await fetch(`[api]?key=${value}`);
        if (result.status === 200) {
            const obj = await result.json();
            return { props : {obj, time: new Date()} };
        }
        return { props : {time: new Date()} };
    }
    catch (e) {
        console.error(e);
        return { props : {time: new Date()} };
    }
}
// 페이지의 경로가 외부 데이터에 의존할 때 사용
export async function getStaticPaths() {
    return {
        paths: [{params : {key : 'something'}}],
        fallback : true,    // false 이면 param 지정값 이외 값은 404
    }
}

export default App;

getInitialProps

  • 넥스트 9.3버전 이전부터 사용되던 함수로 9.3 이상의 버전에서는 getServerSideProps와 getStaticProps를 사용하는 것을 권장
import fetch from 'isomorphic-unfetch';

const App = ({ obj }) => {
    const value = obj?.key;
    return <div>{value}</div>
}

App.getInitialProps = async ({ query }) => {
    const { value } = query.key;
    try {
        const result = await fetch(`[api]?key=${value}`);
        if (result.status === 200) {
            const obj = result.json();
            return {props : {obj}};
        }
        return {props : {}}
    }
    catch (e) {
        console.error(e);
        return {props : {}};
    }
}
export default App;
  • 초기 렌더링 시에는 서버에서 데이터를 불러오지만 클라이언트측 내비게이션을 사용하게 되면 클라이언트 측에서 데이터를 불러옴