๐ NextJS study
- Next.js ๊ธฐ๋ณธ ํ์ต
- ๊ฐ๋จํ ํ ์ด ํ๋ก์ ํธ ๋ง๋ค์ด๋ณด๊ธฐ
- Next.js ์ฌํ ํ์ต
- ํฌํธํด๋ฆฌ์ค ๋๋น ์ปค๋จธ์ค ์๋น์ค ์ ์
- ํ๋ ์์ํฌ๋ ๊ธฐ๋ฐ๊ตฌ์กฐ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฐ ํธ์ ๋๊ตฌ๋ค
- ์ ์ด ์ฃผ๋๊ถ ํ๋ ์์ํฌ๊ฐ ๊ฐ์ง vs ์ ์ด ์ฃผ๋๊ถ ์ฌ์ฉ์๊ฐ ๊ฐ์ง
- ํ๋ ์์ํฌ๋ ๊ธฐ๊ณ (like ๊ตด์ญ๊ธฐ) vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณต๊ตฌ (like ํ์น๋ํผ)
- ํ๋ ์์ํฌ ์์ ๋ ์๋์ ์ผ๋ก ์์ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ๋ ์๋์ ์ผ๋ก ํผ
- ๊ฐ์ธ์ด ํด์ผํ ๊ณ ๋ฏผ๋ค์ ํ๋ ์์ํฌ ๊ฐ๋ฐ์๊ฐ ๋ฏธ๋ฆฌ ํ๊ณ ๋ฐ์
- ํน์ ๋์์ธ ํจํด์ด๋ ๋์๊ณผ ๊ธฐ๋ฅ๋ค์ ์ํ ์ ์์ ๋ฐฉ์์ ์ ๋ฆฌํด๋
- ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํจ๊ป ํ์ ํ ๋ ๊ธฐ์ค์ ์ด ๋จ
- ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ด ๊ฐ์ง ๊ณ ๋ฏผ์ ๋ํ ์ ์ ํ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํด์ค๋ค.
- ๊ท๋ชจ๊ฐ ์๋ ์๋น์ค ๊ตฌ์กฐ ์ค๊ณ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ ?
- ๊ฐ๋ฐํ๊ฒฝ / ์ฝ๋ ๋ถํ / ํ์ผ ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํด์ค๋ค.
- SEO ๊ฒ์ ์์ง ์ต์ ํ (์ฌ์ฉ์๋ค์ด ํจ์ฌ ๋ ์ฝ๊ฒ ์น์๋น์ค๋ฅผ ์ฐพ์๊ฐ ์ ์๋๋ก)
- ํ๋ก ํธ์๋์ ํ์ํ ๊ฐ๋จํ API ๊ตฌ์ฑ
- ์์ฌ์ด ๋ฐฐํฌ ์์คํ Vercel
npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
--example ๋ค์์๋ github url์ ์์ ๋ก ๋ ํฌ๋ฅผ ๋ธ ๊ฒ์ด๋ค ๋ผ๋ ๋ช ๋ น์ด ๋ป์ด๋ค.
cd nextjs-blog
npm run dev = yarn dev (๋์ผ ๋ช
๋ น์ด)
ํด๋น ํ๋ก์ ํธ์์ yarn ์ค์นํจ
turbo๋ผ๋ ๊ฑธ๋ก mono repo ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ฝ๋๋ค์ ๊ณ ์น๋๋๋ก ๋ณ๊ฒฝ๋๋ค (= fast refresh)
pages/product/[slug]๋ผ๋ ํ๊ธฐ๊ฐ wildcard๋ก ๋์ํ๋๋ณด๋ค- ๋ค์ด๋๋ฏนํ๊ฒ path๋ฅผ ๋ณ๊ฒฝํ ์ ์์๋ค.
- api ์์ฒญ์ ์ด๋๋ก ๊ฐ ํ๊ณ ์๋ต์ ๋ฐ๋๋ค.
- api์ ์์ฒญ์ ๋ํ ์๋ต๋ค์ ์ฝ๋์์ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
ํ๋ฉด์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ๊ฒฐ๊ตญ ์ด๋์ ๊ฐ data๋ฅผ ๊ฐ์ ธ์์ผํ๋ค. (=์ด๊ฒ ํ๋ก ํธ์๋์ ์ญํ )
- next๊ฐ ์ ์ํ๋ 4๊ฐ์ง ๋ฐ์ดํฐ ํจ์นญ ๋ฐฉ๋ฒ
- SSR
- CSR
- SSG
- ISR
- ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฐ๋ค.
- SSR์ ๋ด๋นํ๋ ํจ์ :
getServerSideProps
export async function getServerSideProps() {
console.log('server');
return {
props: { time: new Date().toISOString() },
};
}
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ์ด์ง์๋ค๊ฐ props๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์๋ค.
์ผ์ชฝ์ ์๊ฐ์ด ์ฐํ ํฐ ๋ฐฐ๊ฒฝ์ ์น๋ธ๋ผ์ฐ์ ์ ๋๋ค. ์ค๋ฅธ์ชฝ์ ์์ ํ ์์ค์ฝ๋ ๋ด์ฉ์ ๋๋ค.
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ ค์ฃผ๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ๋ ๊ณผ์ ์ผ๋ก ๋ดค์ ๋ server ๋ผ๋ ์ฝ์๋ก๊ทธ ๋ฉ์์ง๊ฐ ํฐ๋ฏธ๋ ์ฐฝ์์ ๋ณด์ฌ์ง๊ณ ์๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฐ๋ค.
- ๊ธฐ์กด ๋ฆฌ์กํธ ์ฌ์ฉ๋ฒ๊ณผ ๋์ผํ๋ค.
์ผ์ชฝ์ ์๊ฐ์ด ์ฐํ ํฐ ๋ฐฐ๊ฒฝ์ ์น๋ธ๋ผ์ฐ์ ์ ๋๋ค. ์ค๋ฅธ์ชฝ์ ์์ ํ ์์ค์ฝ๋ ๋ด์ฉ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋ ค์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ ์น๋ธ๋ผ์ฐ์ ์ ์๋ ์ฝ์๋ก๊ทธ์์ 'client' ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ธํด ๋ณผ ์ ์๋ค.
- ์ ์ ์ธ ์ฌ์ดํธ๋ฅผ ์์ฑํ๋ค : ์ ์ ์ธ ์ฌ์ดํธ๋ฅผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ ค์ค๋ค.
- SSG์ ๋ด๋นํ๋ ํจ์๋ก๋
getStaticProps๋ผ๋ ํจ์๊ฐ ์๋ค. - ์ธ์ ์ฐ์ด๋ ? ๋ธ๋ก๊ทธ ๊ฐ์ด ์ ์ ์ผ ์ ์๋ ๊ฒ๋ค์ ์ด๊ฒ์ ์ฌ์ฉํ๋ค.
SSG ๊ฐ ๋์ํ๋ ๊ฒ์ ํ์ธํ๊ณ ์ ํ๋ค๋ฉด
yarn build๊ณผ์ ์ ๊ฑฐ์น ํ์yarn run dev๋ฅผ ํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ path ์ฃผ์ ssr ํ์ด์ง์ ์ง์ ํ์ ๋, console.log๊ฐ ํฐ๋ฏธ๋์๋ ์น๋ธ๋ผ์ฐ์ ์์ ์๋ ์ฝ์ ์ฐฝ ๊ทธ ์ด๋์๋ ๋ํ๋์ง ์์ต๋๋ค.
- ์ฆ๋ถ ์ ์ ์ฌ์ดํธ๋ฅผ ์ฌ์์ฑ ํ๋ค. (ํน์ ์ฃผ๊ธฐ๋ก) ์ ์ ์ธ ์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ค์ ๊ทธ๋ ค์ค๋ค.
- ์ด๊ฑธ ๋ด๋นํ๋ ํจ์๋
getStaticProps๋ผ๋ ํจ์๋ค. ๊ฐ์ ๋ฆฌํดํ๋ฉด์ ๋์ํ๋ค.
export async function getStaticProps() {
console.log("server");
return {
props: { time: new Date().toISOString() },
revalidate: 1, // ๐ 1์ด ๋จ์๋ก => ์ด ํจ์๋ฅผ ํตํด์ ๊ฐ์ ๋ฆฌํดํด์ ๋ค์ ๊ทธ๋ ค์ค๋ค.
};
}
์๋ฒ๊ฐ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฆฌํด๋๋ค. ์ด๋ค ์ ํ์ ๊ณ์ ํ๋งคํ๊ณ ๊ทธ ์ ํ์ ์ ๋ณด๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ค๊ณ ํ ๊ฒฝ์ฐ ์ด๋ฐ ํจ์๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ ์์ ํ ์๊ฐ ์๋ค. (ex) ์ผํ๋ชฐ์์ ์์ฃผ ์ฌ์ฉ
- ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ์ : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฐ๋ค.
- SSR / CSR / SSG / ISG : ์ด 4๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํจ์นญํ๋ค.
- SSG :
yarn dev๋ก๋ SSR ์ฒ๋ผ ๋์ํ๋ค. - SSR์ ์๋ฒ ๋ถํ๊ฐ ์ผ์ด๋๋ ํ์์ ๋ฐ๋ผ SSG์ ISR์ ์ ์ ํ๊ฒ ์ฐ๋ฉด ์ข๋ค.
- Pre-rendering : SEO ์ ์ด๊ธฐ ๋ก๋ฉ ์๋
- SSG vs SSR : SSG์ ๋น๋ ์ / SSR์ ์์ฒญ ์
- Layout : pages/_app.js ํ์ฉํด์ ํ์ด์ง ๊ณตํตํ
- Images : ์ต์ ํ๋ ์ด๋ฏธ์ง ํ์ฉ util
$yarn prettier-fix
- yarn add -D prettier // prettier ์ถ๊ฐ
- .prettierrc // ํ์ผ ์ถ๊ฐ
- ํจํค์ง์ prettier-fix ๋ช ๋ น ์ถ๊ฐ
- Next.js์ Router๋ file-systems ๊ธฐ๋ฐ์ด๋ค.
pages/ํน์src/pages/pages/index.js์src/pages/index.js๋ ๋ค ์๋ค๋ฉด ์ฐ์ ์์๋pages/index.js๊ฐ ๋จผ์ ๋ค. ํ์ง๋ง ๊ฐ๋ฐํ ๋ ์ต์ํ ํ๊ฒฝ์ผ๋ก๋ ํ์์ด๊ธด ํ๋ค.
pages/caategory/[slug].js => /category/:slug (ex. /category/food) ์ด๋ฐ์์ผ๋ก category ๋ค์ ์๋ฌด ๋จ์ด ์ง์ด๋ฃ์ด๋ ํด๋น ๊ฒฝ๋ก๋ก ์ด๋๋๋ค.
pages/[usename]/info.js => /:usename/info (ex. /jimmy/info) ์ด๊ฒ๋ [usename] ๋ถ๋ถ์ ์๋ฌด ๋จ์ด ์ง์ด๋ฃ์ด๋ ํด๋น ๊ฒฝ๋ก๋ก ์ด๋๋๋ค
- ํ์ผ์๋ slug๊ฐ ๊ฐ๋ฅํ๊ณ , ํด๋์๋ slug๊ฐ ๊ฐ๋ฅํ๋ค.
pages/cart/[...slug].js => /cart/* (ex. /cart/2022/06/04)
- ...์ ์ฐ๋ฉด depth๊ฐ ๋ฌดํ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ชจ๋ ๊ฑธ ๋ค ๋ฐ์๋ผ ์ ์๋ค.
- Router -> file ststems์ ํ ๋๋ก ๊ตฌํ
- pages/ ํน์ src/pages -> pages/ ๊ฐ ์ฐ์ ์์, ํ๋๋ง ๊ฐ๋ฅํ๋ค.
- ํ๋ก์ ํธ ์ค์ -> prettier / jsoncofig.json(์ ๋๊ฒฝ๋ก ๋ณ๊ฒฝ)
- Slug -> ๋ค์ํ ์๊ณ์ ๋ค์ด๋๋ฏน ์ ๊ณตํด์ค๋ค.
- [slug] ๊ฐ์ ์ด๋ป๊ฒ ํ์ฉํ ๊ฒ ์ธ๊ฐ? ex) pages/category/[slug].js
import {useRouter} from 'next/router;
const router = useRouter();
const {slug} = router.query;
- ์ด์ฒ๋ผ router.query์ slug๋ฅผ ์ฐ๋ฉด url์
/category/{slug}์ ์๋{slug}์ ์ ๋ ฅํ ๊ฐ์ด ํ๋ฉด์ ์ฐํ๋ค.
import { useRouter } from 'next/router'
export default function CategorySlug() {
const router = useRouter()
const { slug, from } = router.query
return (
<h1 className="title">
Category {slug} from {from}
</h1>
)
}
CategorySlug.getLayout = function getLayout(page) {
return <>{page}</>
}
category/sports?from=event๋ผ๋ url์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, url์์๋ ?๋ฅผ ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค. ์ด ์ฟผ๋ฆฌ ๊ธฐ์ค์ผ๋ก from์ ๋ฌด์์ด ๋ด๊ฒผ๋์ง ๊ทธ์ ๋ง๋ ๊ฐ์ ๋ค ๋ฐ์ ๋ผ ์ ์๋ค.
์ด์๊ฐ์ด url ๋ค์ event๋ฅผ ๋ฃ๊ฒ ๋๋ฉด ํ๋ฉด์๋ ๋์ผํ๊ฒ {from} ๊ฐ์ด ์ฐํ๊ฒ ๋๋ค.
- pages/cart/[...slug].js
const {slug} = router.query;
์ฌ๊ธฐ์ slug๋ ๋ฐฐ์ด์ด๋ค.
- ๊ฒฝ๋ก : pages/cart/[...date].js
import { useRouter } from 'next/router'
export default function CartDateSlug() {
const router = useRouter()
const { date } = router.query
return (
<>
<h1 className="title">CartDate Slug {JSON.stringify(date)}</h1>
</>
)
}
CartDateSlug.getLayout = function getLayout(page) {
return <>{page}</>
}
์ด์ฒ๋ผ url์ ๋ค์ค ์ฌ๋ฌ๊ทธ๋ค์ ์ ๋ถ ํ๋ฉด์ ๋ฟ๋ ค์ค๋ค. JSON.stringify๋ก ๊ฐ์๊ธฐ ๋๋ฌธ์ "" ๋ฌธ์์ด์ ํ์์ผ๋ก ๋ฐฐ์ด ์์ ๊ฐ์ด ๋ด๊ฒจ ๋์จ๋ค.
- ์ต์
๋ํ๊ฒ ์ฌ๋ฌ๊ทธ ๊ฐ์ด ์์ด๋ ๋์ํ ์ ์๋๋ก ํ๋ ค๋ฉด
[[...date]].js์ด์ฒ๋ผ ๋๊ดํธ๋ฅผ 2๋ฒ ๊ฐ์ธ๋ฉด ๋๋ค.
- getServerSideProps / getStaticProps ๋ฑ์ ๋ค์ ์คํ์ํค์ง ์๊ณ , ํ์ฌ ์ํ๋ฅผ ์์ง ์๊ณ url ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
- ์ฌ์ฉ์๊ฐ ์ด๋ค ๋์์ ํ๊ณ , ๊ทธ ๊ธฐ๋ก์ query๋ก ๋จ๊ธฐ๊ณ ์ถ์๋ (๐ ์ฅ์ : query๋ก ๋จ๊ธฐ๋ฉด ์ฌ์ฉ์๊ฐ ์๋ก๊ณ ์นจ์ ํด๋ ์ ์ง๋๋ค.)
- ํน์ ํ์ด์ง 10ํ์ด์ง ๊ฐ๋ค๊ฐ ์๋ก๊ณ ์นจ ํด๋ ๊ทธ๊ฒ ์ ์ง๋๋ค.
(๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ํตํด ์๋ก๊ณ ์นจ์ ํด๋ ํน์ ํ์ด์ง์ ์์น๋ฅผ ์ ์ง์ํฌ ์ ์์ง๋ง query๋ก ํด๋ ๊ทธ ์ํ๊ฐ ์ ์ง๋๋๋ก ํ ์ ์๋ค.
์ฌ์ฉ์์ ํ๋์ ๊ธฐ๋กํ ํ์๋ค์ด๋ค. ๊ทผ๋ฐ, url ์ ๋ฐ๊ฟจ๋ค๊ณ ํด์ 1๏ธโฃ ํ์ด์ง๊ฐ ์ฒ์๋ถํฐ ๋ค์ ๋ ๋ ๋๋ค๊ฑฐ๋ 2๏ธโฃ ์์น ์๋ ๋ฐ์ดํฐ ํจ์นญ๊น์ง ๋๋ค๋ฉด ๋นํจ์จ์ ์ผ ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๐ Shallow Routing ๐์ด ํ์ํ ๊ฒ์ด๋ค !
- url์ ๋ฐ๊พธ๋ 3๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
- 1๏ธโฃ location.replace("url") : ๋ก์ปฌ state ์ ์ง ์๋จ (re-render)
- 2๏ธโฃ router.push(url) : ๋ก์ปฌ state ์ ์ง / data fetching์ ์ผ์ด๋จ โญ๏ธ
- 3๏ธโฃ router.push(url, as, {shallow: true}) : ๋ก์ปฌ state ์ ์ง / data fetching โ
์ด๊ฒ์ ๋ํ ์์ ๋ `/pages/settings/my/info.js` ์์ ํ์ธํ ์ ์์ต๋๋ค.
// 1๏ธโฃ ๋ก์ปฌ state๋ ์๋ก ๋ฐ๋๋ฉด์ ๋ฐ์ดํฐ ํจ์นญ๋ ๋ค์ ๋๊ณ ์์ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฅธ ๊ฒ๊ณผ ๊ฐ๋ค.
<button
onClick={() => {
alert('edit')
setClicked(true)
โบ๏ธ location.replace('/settings/my/info?status=editing')
}}
>
edit(replace)
</button>
<br />
// 2๏ธโฃ ๋ก์ปฌ state๋ ์ ์ง๋์ง๋ง, ๋ฐ์ดํฐ ํจ์นญ์ ์ผ์ด๋ฉ๋๋ค.
<button
onClick={() => {
alert('edit')
setClicked(true)
โบ๏ธ router.push('/settings/my/info?status=editing')
}}
>
edit(push)
</button>
// 3๏ธโฃ ๋ก์ปฌ ์ํ๋ ์ ์ง๋๊ณ , ๋ฐ์ดํฐ ํจ์นญ๋ ์ผ์ด๋์ง ์๋๋ค.
<button
onClick={() => {
alert('edit')
setClicked(true)
router.push('/settings/my/info?status=editing', undefined, โบ๏ธ {
shallow: true,
})
}}
>
edit(shallow)
</button>
๋ฒํผ 3๊ฐ๋ฅผ ์ถ๊ฐํ์ฌ, ์๋ก ๋ฆฌ๋ ๋๊ฐ ๋๋ฉด์ ๋ฐ์ดํฐ ํจ์น๋ฅผ ํ์ธํ๊ธฐ ์ํด ์๋จ ์ชฝ์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
export async function getServerSideProps() {
console.log('server')
return {
props: {},
}
}
getServerSideProps๋ฅผ ์ด์ฉํด์ ํฐ๋ฏธ๋ ์ฝ์์ 'server' ๋ผ๋ ๋ฉํธ๊ฐ ์ฐํ๋์ง ํ์ธ์ ํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ shallow๋ฅผ ํ์ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ ํจ์นญ์ด ์๋์ง๋ง ๋ก์ปฌ ์ํ๋ ์ ์ง๋๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
- ์ปดํจํฐ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ์ฐ๊ฒฐ
- FE <=> BE ๊ฐ์ ์ฐ๊ฒฐ
- ํ๋ก ํธ๋ ๊ณ ๊ฐ๊ณผ ๋ฟ์์๊ณ , ๋ฐฑ์๋๋ DB์ ๋ฟ์์๋ค.
- ์ค์ ์๋น์ค ์์ )
์ปค๋จธ์ค ์ฌ์ดํธ - ๊ฐ๋ฐ์๋๊ตฌ F12 - ๋คํธ์ํฌ ํญ์์ ํ์ธ ๊ฐ๋ฅ
/pages/api/ํ์ผ๋ช .js
์ด์ฒ๋ผ pages ๋๋ ํ ๋ฆฌ ์์๋ค๊ฐ api ํด๋๋ฅผ ๋ง๋ค์ด์ api๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
import { userDetail } from 'constants/userDetail'
export default function handler(req, res) {
res.status(200).json(userDetail)
}
์ด๋ฐ์์ผ๋ก ๋ถ๋ฌ์์
useEffect(() => {
fetch('/api/user')
.then((res) => res.json())
.then((data) => {
setName(data.name)
})
}, [])
์ด๋ ๊ฒ ํธ์ถํด์ฃผ๊ธฐ.
pages/api/user-info/[uid].js
๐ api/[uid].js ๋ผ๋ ํ์ผ๋ช
์ ์๋์ ๊ฐ์ด ๋ค์ด๋๋ฏน api ๋ผ์ฐํ
export default function handler(req, res) {
const { uid } = req.query
res.status(200).json({ name: `LeeHYUNJU ${uid}` })
}
- Routing ์์ ๋ค๋ค๋ ์ฌ๋ฌ Slug ํ์ฉ๋ฒ ์ ์ฉ ๊ฐ๋ฅ
- ๋ค์ค Route
/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)}` })
}
-
๋ด์ฅ ๋ฏธ๋ค์จ์ด์ ๊ธฐ๋ฅ
- req.cookies / req.query ...
-
req/res ๊ด๋ จ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ Middleware ๋ค์ ํ์ฉํ ์ ์๋ค. ex) CORS (๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ )
- res.status(code)
- res.json(body): serializable object
- res.redirect(code, url) --> code๋ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ๋ปํ๋ค.
- res.send(body) : string / object / Buffer






