/pages/product/[slug]
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. ํ์ผ๊ฒฝ๋ก ๋ฟ๋ง ์๋๋ผ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ ๋ค์ด๋๋ฏนํ๊ฒ path๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.์ด๋ฐ ๋ค์ํ ๊ธฐ๋ฅ ์ ๊ณต์ผ๋ก ์ธํด NextJS๋ฅผ ์ ํํ๋ ์ด์ ๋ค.
npx create-next-app "[ํ๋ก์ ํธ๋ช
]"
// ํ์
์คํฌ๋ฆฝํธ ๋ฒ์
$npx create-next-app --typescript
ํฐ๋ฏธ๋์ ์๋์๊ฐ์ ์ง๋ฌธ๋ค์ด ์์์ง๋๋ฐ
Would you like to use ESLint with this project? โฆ No / Yes
โ Would you like to use Tailwind CSS with this project? โฆ No / Yes
โ Would you like to use src/ directory with this project? โฆ No / Yes
โ Use App Router (recommended)? โฆ No / Yes
โ Would you like to customize the default import alias? โฆ No / Yes
์ด๋ ๊ฒ ์ฒดํฌํ๋ฉด ์๋์ ๊ฐ์ Repo ํด๋ ๊ตฌ์ฑ์ด ์ ํ ๋๋ค.
npm run dev === yarn dev (๋์ผ ๋ช
๋ น์ด)
$yarn prettier-fix
getServerSideProps
๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ์๋ฒ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ ค์ฃผ๊ฒ๋ ์ฌ์ฉํ๋ฉด ๋๋ค.export async function getServerSideProps() {
console.log('server');
return {
props: { time: new Date().toISOString() },
};
}
์ด์๊ฐ์ด ์ฌ์ฉํ ์ ์๊ณ , ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํฐ๋ฏธ๋์์ 'server'๋ผ๋ ๋ฉ์์ง๊ฐ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
getStaticProps
๋ผ๋ ํจ์๊ฐ ์๋ค.getStaticProps
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.export async function getStaticProps() {
console.log("server");
return {
props: { time: new Date().toISOString() },
revalidate: 1, // ๐ 1์ด ๋จ์๋ก => ์ด ํจ์๋ฅผ ํตํด์ ๊ฐ์ ๋ฆฌํดํด์ ๋ค์ ๊ทธ๋ ค์ค๋ค.
};
}
์ด์ฒ๋ผ revalidate๋ผ๋ ํจ์์ ์๊ฐ๊ฐ์ ๋ฃ์ด ๋ฆฌํดํด์ ๋ค์ ๊ทธ๋ ค์ค๋ค. ์ด ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค๋ฉด ์ผํ๋ชฐ์์ ์ด๋ค ์ํ์ ๊ณ์ ํ๋งคํ๊ณ ๊ทธ ์ํ์ ์ ๋ณด๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ ํ๋ค๊ณ ํ ๋ ์ด ํจ์๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํด์ ์์ ํ ์ ์๋ค.
/pages/index.js
์ /src/pages/index.js
์ด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ํ์ ๋, ์ฐ์ ์์๋ /pages/index.js
๊ฐ ๋จผ์ ๋ค. ํ์ง๋ง, ๊ฐ๋ฐํ ๋ ์ต์ํ ํ๊ฒฝ์ผ๋ก๋ /src/pages/
๋ฃจํธ๊ฐ ๋ ์ต์.. ์ํผ ์์
์ ํธํ๋๋ก ํ๋ฉด ๋จ ใ
ใ
pages/caategory/[slug].js => /category/:slug (ex. /category/food) ์ด๋ฐ์์ผ๋ก category ๋ค์ ์๋ฌด ๋จ์ด ์ง์ด๋ฃ์ด๋ ํด๋น ๊ฒฝ๋ก๋ก ์ด๋๋๋ค.
pages/[usename]/info.js => /:usename/info (ex. /jimmy/info) ์ด๊ฒ๋ [usename] ๋ถ๋ถ์ ์๋ฌด ๋จ์ด ์ง์ด๋ฃ์ด๋ ํด๋น ๊ฒฝ๋ก๋ก ์ด๋๋๋ค
pages/cart/[...slug].js => /cart/* (ex. /cart/2022/06/04)
import {useRouter} from 'next/router;
const router = useRouter();
const {slug} = router.query;
/category/{slug}
์ ์๋ {slug}์ ์
๋ ฅํ ๊ฐ์ด ํ๋ฉด์ ์ฐํ๋ค.์ฌ์ฉ์๊ฐ ์ด๋ค ๋์์ ํ๊ณ ๊ทธ ๊ธฐ๋ก์ ์ฟผ๋ฆฌ๋ก ๋จ๊ธฐ๊ณ ์ถ์๋
ํน์ ํ์ด์ง์ธ 10 page์ ๊ฐ๋ค๊ฐ ์๋ก๊ณ ์นจ ํด๋ ๊ทธ๊ฒ ์ ์ง๊ฐ ๋๋ค.
์ฌ์ฉ์์ ํ๋์ ๊ธฐ๋กํ ํ์๋ค์ด๋ค. (ํ์ด์ง ์์น ์ด๋) ๊ทผ๋ฐ URL์ ๋ฐ๊ฟจ๋ค๊ณ ํด์ ํ์ด์ง๊ฐ ์ฒ์๋ถํฐ ๋ ๋ ๋๋ค๊ฑฐ๋, ์์น ์๋ ๋ฐ์ดํฐ ํจ์นญ๊น์ง ์ด๋ค์ง๋ค๋ฉด ๋นํจ์จ์ ์ผ ์๊ฐ ์๋ค. ๊ทธ๋์ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๐Shallow Routing๐์ด ํ์ํ ๊ฒ์ด๋ค.
์ด๋ฐ ์ ์ ์์ด์ ์ต์ ํ ์ํฌ ์ ์๋ค๋ ์ฅ์ ์ Shallow Routing ์ ์ ์ฉํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
<button
onClick={() => {
alert('edit')
setClicked(true)
router.push('/settings/my/info?status=editing', undefined, โบ๏ธ {
shallow: true,
})
}}
>
shallow
</button>
์ด๋ฐ์์ผ๋ก ์ฐ์
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ธํ๊ธฐ ์ํด getServerSideProps
๋ฅผ ์ด์ฉํ์ฌ ํฐ๋ฏธ๋ ์ฝ์์ฐฝ์ ๋ฉ์์ง๊ฐ ์ฐํ๋์ง ํ์ธ ํด๋ดค๋ค. ๊ทธ๋ฐ๋ฐ Shallow๋ฅผ ํ์ ๋๋ ๋ฐ์ดํฐ ํจ์นญ์ด ์ผ์ด๋์ง ์์ผ๋ฉด์ ๋ก์ปฌ ์ํ๊ฐ ์ ์ง๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์น์ฌ์ดํธ - ๊ฐ๋ฐ์๋๊ตฌ - ๋คํธ์ํฌ
์์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.API๋ pages ๋๋ ํ ๋ฆฌ ์์๋ค๊ฐ api ํด๋๋ฅผ ์์ฑํ์ฌ api ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
import { userInfo } from 'v1/user'
export default function handler(req, res) {
res.status(200).json(userInfo)
}
์ด๋ฐ์์ผ๋ก api ํ์ผ์ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ Routing ์์ ๋ค๋ค๋ ์ฌ๋ฌ Slug ํ์ฉ๋ฒ์ API์์๋ ๋์ผํ๊ฒ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
/api/post/create.js
/api/post/[pid].js
/api/post/[...slug].js --> ๋ค์ค slug
/api/post/[[...slug]].js --> ์ต์
๋ํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
ํ๋ฌผ๋ฉฐ ์ฟ ํค ์ ๋ณด๋ ๋ด์๋ผ ์ ์๋ค.
export default function handler(req, res) {
const { uid } = req.query
const cookies = req.cookies
res.status(200).json({ name: `LeeHYUNJU ${uid} ${JSON.stringify(cookies)}` })
}
์ด๋ฐ์์ผ๋ก ์ฟ ํค ์ ๋ณด๋ฅผ ๋ด์๋ด์ด ํธ์ถํ ์ ์์ ! Next์์ api์ ์ํ ์ฝ๋๊ฐ๊ณผ ์ฌ์ฉ์ ์ฝ๋ ๋ฑ๋ฑ์ Reponse ๊ท๊ฒฉํ๋ฅผ ํ ์ ์๋ค๋ ์ ์ด ๋ Next์ ํน์ง์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
Next ํ๋ ์์ํฌ์ ๋ํด ๊ณต๋ถํ๋ค๋ณด๋ '์ญ์ฌ ๋จ๋ค์ด ๋ค ์ฐ๋ ์ด์ ๊ฐ ์๋ค๋๊น.....๐ฒ'๋ฅผ ๋๋ผ๋ฉด์ ๋๋ ์กฐ๋ง๊ฐ ์ฌ์ด๋ ํ๋ก์ ํธ์ ์ ์ฉํด ๋ด์ผ๊ฒ ๋ค. ๊ธฐ์กด์๋ Next ํ๋ ์์ํฌ๋ก ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๋ง ํด๋ ์ํ๋ก page-based routing sytems๋ง ์ด์ฉํด๋ดค์ง ๊ทธ ์ธ์ ๊ธฐ๋ฅ๋ค์ ์จ๋ณธ ์ ์ด ์์๋ค.
Next์ ๊ฐ์ฅ ํฐ ๋งค๋ ฅ์ SEO(๊ฒ์ ์์ง ์ต์ ํ)์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ์ ์ผ๋ก๋ ์ต์ ํ ํด์ฃผ๋ ๊ฒ์ด ์ ๋ง ํฐ ์ฅ์ ์ธ๋ฐ,,, ์ด๋ฒ ๊ธฐํ์ ํ์ตํ๋ ๋ด์ฉ๋ค์ ์ ํ์ฉํด์ ๋ด๊ป๋ก ๋ง๋ค์ด์ผ์ง.
Next ๊ณต์๋ฌธ์ ๐ https://nextjs.org/docs/getting-started
ํน์ ์ธ๋ฌ์์งค๋ค์ ๋ณดํต ๋ง๋์ ๊ฑธ๊น์..? ์๋๋ฉด ๊ตฌํ์ ๊ฑธ๊น์..? ๋๋ฌด ๋๋ฌด ํ๋ฉ๋๋ค