ํด๋น ๋ธ๋ก๊ทธ ์๋ฆฌ์ฆ๋ ์ ์งํ๊ฒ ๋ฐฐ์๋ณด๋ Next js ์๋ฆฌ์ฆ๋ก์จ ์ด 8๋ถ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
Next.js๊ณต์ ํํ์ด์ง์์ ์ด์ผ๊ธฐํ๋ ๋ด์ฉ์ ์ต๋ํ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ด๊ฒ ๊ตฌ์ฑํ์์ต๋๋ค.
0. ๋ชฉ์ฐจ
1. create-next-app์ผ๋ก next ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ํ๊ธฐ
2. create-next-app์์ ๋ง๋ ์ฒซ ๋ฒ์งธ ํต์ฌ pages. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ผ์ฐํ
3. ํ์ด์ง๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ Link-Component ๊ทธ๋ฆฌ๊ณ Pre-Fetch
Dynamic Routing๊ณผ Link๋ฅผ ์ด์ฉํด ๊ฐ๋จํ ๊ฒ์ํ์ ๋ง๋ค์ด๋ณด์.
4. Next.js์์ head ํ๊ทธ๋ฅผ ์กฐ์ํ๋ ๋ฉ์ง ๋ฐฉ๋ฒ
๋ฒ์ธ & ์ค์ต) ์ด๋ฏธ์ง์ ๋์์์ ์ ์ฅํ๊ณ ์ฌ์ฉํด๋ณด์.
5. ์น์ ๋ฐ์ ๊ณผ์ ์ผ๋ก ๋ณด๋ SSG์ SSR
6. next์ ๋ ๋ฒ์งธ ํต์ฌ Pre-Rendering
7. SSG๋ก ๊ฒ์ ์์ง ์ต์ ํ ๋ ธ๋ฆฌ๊ธฐ
8. ์ ์งํ๊ฒ ๋ฐฐ์๋ณด๋ Next.js ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ..
์ ์ฐ๋ฆฌ๋ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ index.html
ํ์ผ์ ๋ณด์ง ๋ชปํ์๊น?
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Next์ SSG ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด? ์ฆ pages
๋๋ ํ ๋ฆฌ ์๋์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค๋ฉด HTML ํ์ผ์ Build๋ ๋ ์์ฑ๋๋ค.
์ด ๋ง์ด ๋ฌด์จ ๋ง์ด๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ์ ๋ค ํ๊ณ ๋น๋ ์คํฌ๋ฆฝํธ๋ง ์ณ์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ผ ์๋ง ์ด๋ฐ ๋ช
๋ น์ด๋ฅผ ์น๊ฒ ๋ ๊ฒ์ด๋ค.
// next build ๋ช
๋ น์ด๋ฅผ ์น ๊ฒฝ์ฐ
$ next build
// npm script๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ๊ฒฝ์ฐ
$ npm run build
// yarn script๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ๊ฒฝ์ฐ
$ yarn build
๊ทธ๋ผ ๊ทธ์ ์์ผ HTML ํ์ผ์ด ์์ฑ๋๊ณ ๊ฐ๊ฐ ์์ฒญ์ ๋ฐ๋ผ HTML์ด ์ฌ์ฌ์ฉ ๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ๋ด์์ html
ํ์ผ์ ๋ณด์ง ๋ชปํ ์ด์ ์ด๋ค.
SSG
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ธ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ Next์์ ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ผ 2๊ฐ์ง ์ํฉ์ ๋๋ ์ ์๋๋ฐ
- ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
๋ก ๋๋ ์ ์๋ค.
์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
์ฐ์ ์ธ๋ถ ๋ฐ์ดํฐ ์ฌ์ฉ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์.
function About() {
return <div>About</div>
}
export default About
์ฌ๊ธฐ์๋ ๋ณด์ด๋ค์ถ์ด ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋์ง ์์๋ค.
์ฆ next๊ฐ pre-render์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋์ด์ผ ํ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์ ๊ณต๋์ง ์์๋ค๋ ์๋ฆฌ์ธ๋ฐ, ์ด ๋๋ ๋จ์ํ HTML์ build ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
์ฐ๋ฆฌ๊ฐ ์น์ ๋ง๋ค๋ค ๋ณด๋ฉด ํน์ ํ์ด์ง์์๋ ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋๊ฐ ์๋ค.
๊ทธ๊ฒ ๊ฐ์ ํ์ผ ์์คํ
์ ์กด์ฌํ๋ dummy.json
์ด๋ ์ผ๊ธฐ.mdwn
์ด๋ ํน์ ๋ค๋ฅธ url์์ api ํธ์ถ์ ํ๋ ๊ฒ์ด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ผ์ปซ๋๋ค.
๊ทธ ๋ nextjs์์๋ ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ exportํ ๋ Next๊ฐ ์ ๊ณตํ๋ 2๊ฐ์ง ํจ์๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
์ํฉ์ ๋ง๊ฒ?
๊ทธ๋ ๋ค. ์ํฉ์ ๋ง๊ฒ.
2๊ฐ์ง ์ํฉ์ด ์๋ค.
- ํ์ด์ง์์ ๋ด์ฉ์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
- ํ์ด์ง์ url์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ.
๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ํจ์๊ฐ ๋ค๋ฅด๋ค.
์ฒซ ๋ฒ์งธ ์ํฉ์ธ _ํ์ด์ง์์ ๋ด์ฉ์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ getStaticProps
๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํดํ๊ณ
๋ ๋ฒ์งธ ์ํฉ์ธ ํ์ด์ง์์url์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ getStaticPaths
๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
getStaticProps ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ํ์ด์ง ๋ด๋ถ์์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ ํจ์์ธ getStaticProps
๋ฅผ export ํด์ค์ผ ํ๋ค.
getStaticProps
๋ async
ํจ์์ด์ด์ผ ํ๋๋ฐ, ์ด ํจ์๋ฅผ Next.js ๋ ๋น๋ ์์ ์ ํด๋น ํจ์์์ ๋ฐํ๋ props๋ฅผ ์ด์ฉํด์ Pre-Rendering์ ์งํํ๊ฒ ๋๋ค.
// ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
export async function getStaticProps(context) {
return {
props: {}
}
}
// ES6 ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
export const getStaticProps = async(context) => {
return {
props: {}
}
}
์ฌ๊ธฐ์ props:{}
๋ผ๋ ๊ฐ์ฒด๊ฐ ์๋ค.
props ๊ฐ์ฒด๊ฐ ๋ฐ๋ก Pre-Rendering์ ์ํด Next๊ฐ ํ์๋ก ํ๋ ๊ฐ์ด๋ค.
ํด๋น ๊ฐ๋ค์ ์ด์ฉํด์ ํด๋น ์ปดํฌ๋ํธ์ ๊ฐ๋ค์ ์ถ๊ฐํด์ค๋ค.
์ฌ์ฉํด๋ณด๊ธฐ
getStaticProps
๋ฅผ ์ฌ์ฉํด์ Pre-Rendering ํด๋ณด๊ธฐ ์ํด์ ํ๋ก์ ํธ ์๋ ๋๋ ํ ๋ฆฌ์ data.js
ํ์ผ์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น data ํ์ผ์์ import ํ ๊ฐ๋ค์ Pre-Rendering ํด๋ณด์.
data.js
์๋ data.js ํ์ผ์ ์๋ ๋ฐ์ดํฐ๋ค์ด api ์์ฒญ์์ํด์ ๊ฐ์ ธ์์ง ๊ฐ์ด์ด์ผ ํ๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ์ ๋ชฉ์ ์ getStaticProps
๋ฅผ ์์๊ฐ๊ธฐ ์ํ ๊ฒ์ด๋ฏ๋ก data.jsํ์ผ ๊ฐ๋ค์ด ๋ฐ์ดํฐ ์์ฒญ๋ ๊ฐ์ด๋ผ๊ณ ๊ฐ์ ํ์.
export const data = [
{ id: 1, name: "James", email: "james123@gmail.com" },
{ id: 2, name: "Andre", email: "Andre@naver.com" },
{ id: 3, name: "Michel", email: "Michel@hanmail.net" },
]
index.js
import React from "react";
import { data } from "../data/myInfo";
const Info = ({ jsonData }) => {
return (
<div>
<h1>this is about</h1>
{jsonData.map((data) => (
<div key={data.id}>
<h3>{data.name}</h3>
<ul>
<h4>{data.email}</h4>
</ul>
</div>
))}
</div>
);
};
export async function getStaticProps(context) {
return {
props: {
jsonData: data,
},
};
}
export default Info;
์ด๋ ๊ฒ ํ๋ฉด import {data} from "../data/myInfo"
๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ Pre-Rendering ํ ์ ์๊ฒ ๋๋๋ฐ, ๋ง์ฝ ์ฌ๊ธฐ์ data์ ๊ฐ์ด ์๋ค๋ฉด notFount
๋ฅผ ๋ฐํํด์ค ์ ์๋ค.
export async function getStaticProps(context) {
if(!data) {
return {
notFound: true,
}
}
return {
props: {
jsonData: data,
},
};
}
export default Info;
๊ทธ๋ผ ๊ฒฐ๊ณผ๋ก ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
getStaticPaths ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ํ์ด์ง์ url์์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ ํจ์์ธ getStaticPaths
๋ฅผ export ํด์ค์ผ ํ๋ค.
์ฃผ๋ก ๋์ ๋ผ์ฐํ ์์ ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๋ค.
getStaticPathss
๋ async
ํจ์์ด์ด์ผ ํ๋๋ฐ, ์ด ํจ์๋ฅผ Next.js ๋ ๋น๋ ์์ ์ ํด๋น ํจ์์์ ๋ฐํ๋ props๋ฅผ ์ด์ฉํด์
Pre-Rendering์ ์งํํ๊ฒ ๋๋ค.
// ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
export async function getStaticPaths() {
return {
paths: [
{ params: { ... } }
],
fallback: true or false
};
}
// ES6 ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
export const getStaticPaths = async () => {
return {
paths: [
{params: { ... }}
],
fallBack: true or false
}
}
์ฌ๊ธฐ์ paths
์ fallBack
๊ฐ๋ค์ด ์๋ค.
paths
getStaticPaths
์ ํ์ ๊ฐ์ด์ด๋ฉฐ, paths ์์ ๋ฐํ๋๋ params
๊ฐ์ผ๋ก ๋์ ๋ผ์ฐํ
๊ฒฝ๋ก์ ์ด๋ฆ์ด ๋๋ค.
์๋ฅผ ๋ค์ด
export const getStaticPaths = async () => {
return {
paths: [
{ params: { id: '1' } },
{ params: { id: '2' } },
]
}
}
๊ณผ ๊ฐ์ด ๋ฐํ ๋๋ค๋ฉด Next๋ static ํ๊ฒ url์ post/1
๊ณผ post/2
์ ์์ฑํด๋ธ๋ค.
์ฃผ์ํด์ผํ ์ ์ด ์๋๋ฐ, params
๋ ํ์ด์ง ์ด๋ฆ๊ณผ ๊ฐ์์ผ ํ๋ค.
์๋ฅผ ๋ค์ด์ pages/posts/[postId]/[commentId]
๋ผ๋ ํ์ด์ง ์ด๋ฆ์ด ์๋ค๋ฉด params
๊ฐ์ฒด๋ ๊ผญ postId
์ commentId
๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค.
fallBack
fallBack ๊ฐ๋ ํ์ ๊ฐ์ธ๋ฐ, fallBack ์ Boolean ํ์ ์ด๋ค.
fallBack์ด false๋ผ๋ฉด getStaticPaths
์์ ๋ฐํ๋์ง ์๋ ๋ชจ๋ ๊ฒฝ๋ก๋ 404 ํ์ด์ง๊ฐ ๋๋ค.
๋๊ธ