Project/Portfolio
#6 데이터 가져오기
믹석이
2023. 3. 31. 16:23
728x90
getStaticProps
Next.js 에는 getStaticProps라고 데이터를 가져올 수 있다.
쉽게 말해 getStaticProps은 처음 렌더링이 될 때만 가져오는 함수 같은 거다.
components/projects.tsx
import Layout from "@/components/layout";
import type { NextPage } from "next";
import axios from "axios";
import { IProjectProps, IProjects } from "@/types/project";
import ProjectItem from "@/components/projects/project-item";
import Seo from "@/components/seo";
import Typical from "react-typical";
const Projects: NextPage = ({ project }: IProjectProps) => {
return (
<Layout>
<Seo title="Projects" content="Projects" />
<h1 className="typical">
<Typical steps={[`프로젝트`]} loop={undefined} wrapper="strong" />
</h1>
<div className="grid grid-cols-1 md:grid-cols-3 gap-5 py-10 sm:w-full ">
{project.map((aProject: IProjects) => (
<ProjectItem key={aProject.id} data={aProject} />
))}
</div>
</Layout>
);
};
export default Projects;
// getStaticProps => 처음 렌더링 될 때 가져온다.
export async function getStaticProps() {
const options = {
method: "POST",
url: `https://api.notion.com/v1/databases/${process.env.NOTION_DATABASE_ID}/query`,
headers: {
accept: "application/json",
"Notion-Version": "2022-06-28",
"content-type": "application/json",
Authorization: `Bearer ${process.env.NOTION_TOKEN}`,
},
data: {
sorts: [
{
property: "Date",
direction: "descending",
},
],
page_size: 100,
},
};
const res = await axios.request(options);
const project = await res.data.results;
// const projects = await res.data.results.map((project: IProjects) => project);
return {
props: { project },
};
}
TypeScript를 사용했기 때문에 포스트맨에서 가져온 값을 Type을 정해줘야 한다.
getStaticProps를 만들어 포스트맨에서 했던 거처럼 만들어준다.
노션 데이터베이스 아이디랑 노션 토큰은 env 파일에 넣어놔서 가져오고, data 안은 body 여서 정렬할 수 있는 sorts로 정렬을 한다.
그리고 return 반환값에 props: {보내고 싶은 값}을 보내주고 props로 받아주면 된다.
한마디로 말해 export async function getStaticProps() 이 부분은 서버 쪽이고,
const Projects: NextPage = ({ project }: IProjectProps) 이 부분은 클라이언트 쪽이라고 생각하면 쉽다.
그래서 props로 받은 project를 콘솔로 찍어보면 위 사진과 같이 getStaticProps에서 뽑은 값을 가져온다.
LIST