Next.js에서 Axios를 통해 getStaticProps를 사용해보자(feat. typescirpt)

허민(허브)·2022년 3월 26일
5

왜?

평소 next.js에서도 axios를 즐겨 쓰는 나는 getStaticProps를 사용할때도 fetch가 아닌 axios를 써서 데이터를 받아오고 싶었다. SSR 방식으로 메뉴를 가져오고 싶어서 한번 적용을 해보았다. 스크린샷처럼 추가된 데이터를 받아오는 형식이라 CSR이 적합할 것 같으나 한번 적용해보고 싶어서 해보았다.

API 설계가 아직 안됐어요

아아... 그래서 먼저 serverless 방식으로 API를 하나 만들어 주었다. 이미지가 JSON에 어떻게 들어갈지는 백엔드쪽에서 달라질 수 있기 때문에 간단한 프로토타입 코드를 짠다고 생각하고 이미지는 임시로 뺐다.

Next.js api 만들기

next.js에서는 api routes를 지원하기 때문에 serverless 방식으로도 웹을 만들 수 있다는 장점이 있다.

https://nextjs.org/docs/api-routes/introduction

나는 pages/api/getFood.ts 라는 파일을 하나 만들어 주고 아래와 같이 json을 반환하는 코드를 하나 만들어주었다.

import type { NextApiRequest, NextApiResponse } from "next";

type Data = {
  name: string;
  price: number;
  content: string;
};

export default function handler(
  req: NextApiRequest,
  res: NextApiResponse<Data[]>
) {
  res.status(200).json([
    {
      name: "토마토 연어 구이",
      price: 9000,
      content:
        "생토마토로 후레쉬한 소스를 만들어 연어스테이크와 곁들인 슈퍼푸드로 만든 건강한 요리!",
    },
    {
      name: "계란 오이 정식",
      price: 7000,
      content:
        "싱싱한 슬라이스 오이에 부드럽게 익은 달걀을 고소한 견과류와 곁들인 비건 정식!",
    },
    {
      name: "토마토 연어 구이",
      price: 9000,
      content:
        "생토마토로 후레쉬한 소스를 만들어 연어스테이크와 곁들인 슈퍼푸드로 만든 건강한 요리!",
    },
    {
      name: "계란 오이 정식",
      price: 7000,
      content:
        "싱싱한 슬라이스 오이에 부드럽게 익은 달걀을 고소한 견과류와 곁들인 비건 정식!",
    },
  ]);
}

GetStaticProps

자 그러면 원하는 페이지 혹은 컴포넌트에서는 어떻게 사용을 할 수 있을까?? 페이지 하단에 아래와 같이 로직을 보통 작성을 한다.

export async function getStaticProps() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()

  return {
    props: {
      posts,
    },
  }
}

https://nextjs.org/docs/basic-features/data-fetching/get-static-props

나는 Axios를 활용해서 try-catch를 통해 로직 분기를 해주는 편이기 때문에 아래와 같이 작성을 하였다.

interface IFoodData {
  name: string;
  price: number;
  content: string;
}

export async function getStaticProps() {
  try {
    const response = await axios.get<IFoodData>(
      "http://localhost:3000/api/getFood"
    );
    const data = response.data;
    return {
      props: {
        foodGetData: data,
      },
    };
  } catch (err) {
    console.log(err);
  }
}

그리고 Page에서는 리턴된 props를 받아 사용을 하면 된다.

interface Props {
  foodGetData: IFoodData[];
}

const MenuPage: NextPage<Props> = ({ foodGetData }) => {... 
profile
Adventure, Challenge, Consistency

1개의 댓글

comment-user-thumbnail
2022년 7월 2일

감사합니다.. 슬퍼하고 있었는데 쓰신 글 덕분에 오류가 해결되었어요 ! 감사합니다

답글 달기