๐ซ ์
๋ก๋๊ฐ ๋๋ ธ๋ ์ด์ ...
- ๊ธฐ์กด ClubStudy ํ์ด์ง๋ ํ๋์ฝ๋ฉ์ผ๋ก ์์ฑ๋์ด์์๋ค..(์์
์ด๋ฐ ๋์ ์ค๋ ฅ ๋ฏธ์๊ณผ ๊ธฐํ์ด ์งง์์ด์)
- ๊ทธ๋์ ํด๋น๋ถ๋ถ์ API๋ฅผ ๋ฐ์์์ ์ ์ฉํ๋ คํ๋ค ๋ณด๋ ๋ฐ์ํ๋ ์ค๋ฅ๊ฐ ์์๋ค.
- ํ์ง๋ง ์ค๋ฅ๊ฐ ํ๋๋ฅผ ํด๊ฒฐํ๋ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๊ณ์ ๋ฐ์ํ๊ณ , ์ฒ์ฒํ ์ฒ์๋ถํฐ ๋์๊ฐ๋ณด์ ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
- ํ๋ถ๋ถ๋น ํ๋์ฉ ์
๋ก๋๋ฅผ ํ์ด์ผํ๋๋ฐ...๋๋ฅผ ๊ณผ์ ํด์ ํ๋ฃจ๋ง์ ๋ค ํด๊ฒฐํ ์ค ์์๋ค..
- ์ด์ ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊ณ , ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ํ์ธํด๋ณด์.
โ
๋ฌธ์
1. CSR vs SSG vs SSR
- CSR์ JSํ์ผ์ ์ ๋ถ ๋ก๋ํด์ผ, ํ์ด์ง ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ ์ ์์ผ๋ฏ๋ก SEO์ ์ทจ์ฝํ๋ค. ํ์ง๋ง ํด๋น ์น์ฌ์ดํธ๋ ๋ง์ผํ
์ ์ํด SEO๊ฐ ํ์ํ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ CSR์ ์ ์ธํ๋ค.
- SSG์ SSR ์ค์ ์ ํ์ ํด์ผํ๋ค. SSR์ ์ฅ์ ์ผ๋ก๋ ๋ ๋ง์
์ค์๊ฐ
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์๋ต์ ํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ํ์ด์ง ํน์ฑ์ ์ค์๊ฐ์ผ๋ก ๋ฐ๋๋ ๋ฐ์ดํฐ๊ฐ ๋น๋ฒํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋ ๋น ๋ฅธ SSG๋ฅผ ์ ํํ๊ธฐ๋ก ํ๋ค.
2. API์ฐ๋
- Next JS์์ SSG ๋ฐฉ์์ผ๋ก API ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์๋ getStaticProps๊ฐ ์๋ค.
export const getStaticProps: GetStaticProps = async (context) => {
const res = await fetch('https://.../posts')
const posts = await res.json()
// ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด notFound๋ฅผ ๋ณด๋ธ๋ค
if (!data) {
return {
notFound: true,
}
}
return {
props: {
posts,
},
}
}
- ๋ฉ์ธํ์ด์ง์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ง๋ง, detail_study์์ ํด๋น ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ์์ธ ํ์
1. detail_study๋ ์ด๋ป๊ฒ ์ด๋ค์ ธ์๋.
- ๋ฉ์ธํ์ด์ง์์ ์คํฐ๋ ์นด๋๋ฅผ ๋๋ฅด๋ฉด ํด๋น ์คํฐ๋์ ์์ธํ์ด์ง๋ก ์ด๋ํ๊ฒ ํด์ผํ๋ค. ์ด๋ ์๊ฐํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋๊ฐ์ง๊ฐ ์๋ค.
- router.query๋ฅผ ์ด์ฉํ์ฌ ์คํฐ๋ ์นด๋๋ฅผ ํด๋ฆญํ์ ๋, ํ์ด์ง๋ฅผ ์ด๋ํ๋ฉด์ studyId๋ฅผ ํจ๊ป ๋ณด๋ด์ API์ studyId๋ฅผ ๋ณด๋ด ํด๋น ์คํฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ๋ฒ
- Next JS์ dynamic routing์ ์ด์ฉํด์ ๋์ ์ผ๋ก studyId์ ๋ฐ๋ผ ํ์ด์ง๋ฅผ ์ด๋ํ๋๋ก (ex : studyId๊ฐ 1์ผ ๊ฒฝ์ฐ clubstudy.net/detail_study/1) ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ํด๋น ๋ณด๊ธฐ๋ค ์ค ํ๋ฒ ๊ตฌ์ฑ์ ํ๋ฉด ๊ด๋ฆฌ์์ ๊ฐ์
์ด ์๋ 2๋ฒ์ ํํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
<StudyCardBox
onClick={() => {
const path = `/detail_study/${Props.id}`;
router.push({
pathname: path,
});
}}
maxWidth="xs"
>
2. getStaticPaths๋?
- If a page has dynamic routes and uses getStaticProps it needs to define a list of paths that have to be rendered to HTML at build time.
๊ณต์๋ฌธ์
- ์ฆ, ๋์ ๋ผ์ฐํ
+ getStaticProps๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ getStaticPaths๋ก ๊ฒฝ๋ก๋ฅผ ์ง์ ํด๋์ผ ํ๋ค.
- prerenderingํ๋ ๊ณผ์ ์์ ๊ฒฝ๋ก๊ฐ ์ธ๋ถ์ ์์กดํ๊ฒ ๋์๋, getStaticProps๋ง์ผ๋ก๋ ํ ์ ๊ฐ ์๋ค. ์๋ํ๋ฉด
/detail_study/${Props.id}
์์ id์ ์ด๋ค ๊ฐ์ด ์๋์ง ์ ์ ์๊ณ , ์ง๊ธ ์๊ณ ์๋๋ผ๋ ์ถ๊ฐ๋๋ฉด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
- getStaticPaths๋ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋น๋์์ ํธ์ถ๋๋ฉฐ id์๋ ์ด๋ค ๊ฐ๋ค์ด ์๋์ง ๋ฏธ๋ฆฌ ํ์
ํด์ getStaticProps์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
์๋
export const getStaticPaths: GetStaticPaths = async () => {
// posts๋ฅผ ๋ฐ๊ธฐ ์ํด fetch
const res = await fetch(`https://api-/`);
const posts = await res.json();
// pre-renderํ Path๋ฅผ ์ป์ (posts๋ฅผ ํตํด์)
const paths = posts.map((study: StudyInfoType) => ({
params: { post: study.studyId.toString() },
}));
return { paths, fallback: false };
};
// ๋น๋๋ ๋ ์คํ
export const getStaticProps: GetStaticProps = async (context) => {
// params๋ post `id`๋ฅผ ํฌํจํ๊ณ ์๋ค
const { id } = context.params as IParams;
const res = await axios.get(
`http://api-/{id}`,
);
const data = res.data;
// ํด๋น ํ์ด์ง์ props๋ก ๋ณด๋
return { props: { study: data } };
};
- ํ์ง๋ง ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ง์ง ๋ง์ด ์ฐพ์๋ณด๊ณ ๋๋์ด ํด๊ฒฐ๋ฒ์ ์ฐพ์์ค ์๊ณ ๊ธฐ๋ปค์๋๋ฐ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
- ๊ทธ๋ ๋ค๋ ๊ฒ์ Path๋ฅผ ํตํด ๊ฐ์ ธ์๋ค๋ ๊ฒ ๊ฐ์๋ฐ parameter์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ ๋ค์ ํ์ธ์ํ๋ค.
- ์ ๋ง ๊ฐ๋จํ ๋ฌธ์ ๋ก path์์ ๋ณด๋ด๋ params์๋ post๊ฐ ์๋ StaticProps์ ๊ฒ ๊ณผ ๊ฐ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
ํด๊ฒฐ
export const getStaticPaths: GetStaticPaths = async () => {
// posts๋ฅผ ๋ฐ๊ธฐ ์ํด fetch
const res = await fetch(`https://api-/`);
const posts = await res.json();
// pre-renderํ Path๋ฅผ ์ป์ (posts๋ฅผ ํตํด์)
const paths = posts.map((study: StudyInfoType) => ({
params: { id: study.studyId.toString() },
}));
return { paths, fallback: false };
};
๋๋์
- ํ์ด์ง ๋ ๋๋งํ๋ ๋ฐฉ์๋ถํฐ API ์ฐ๋, Dynamic Routing, StaticPaths, StaticProps๊น์ง ํ๋ฒ์ ์ ๋ง ๋ง์ ๊ณต๋ถ๋ฅผ ํ ๊ฒ ๊ฐ์๋ค.
- ์ฒ์์ผ๋ก ํ๋ ๊ฒ๋ค์ด ๋ง์์ ๊ฐ๋ฐ ์ค๊ณ๋ถํฐ ํ์ง ์๊ณ , ๋งจ๋ฐ๋ฅ์ ํค๋ฉ์ผ๋ก ์์ํ๋ค๋ณด๋ ๋งํ๋ ๋ถ๋ถ์ด ๋ง์๋ค. ํ์ง๋ง ์ด๋ฒ ๊ฒฝํ์ ํตํด์ ์ด๋ป๊ฒ ์ค๊ณ๋ฅผ ํ ์ง ์๊ฒ ๋์๊ณ , ๊ณต๋ถํ๋ ๋ฐฉ๋ฒ์ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ์๋ค.
- ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋์ฉ ํ์ด๋๊ฐ๋ ๊ณผ์ ์ด ์์ง๊น์ง ๋๋ ๋๋ฌด ์ฌ๋ฐ๋ค. ์์ผ๋ก๋ ์ฌ๋ฐ๊ธธ ๋ฐ๋ผ๋ฉฐ ์ค๋ ๊ธฐ๋ก ๋!
๐ ์ฐธ์กฐ
https://mui.com
https://agilejung.tistory.com/entry/MUI%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
https://ajdkfl6445.gitbook.io/study/web/csr-vs-ssr-vs-ssg
https://han-py.tistory.com/489
https://velog.io/@devstone/Next.js-100-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-feat.-initialProps-webpack-storybook#-getstaticpaths-static-generation