๐Ÿ‘ฉ‍๐ŸŽค ํ”„๋ก ํŠธ์—”๋“œ/nextjs

    [Next.js][react-query] API Routes ์‚ฌ์šฉ์‹œ ๋ฌดํ•œ request ๋ฐœ์ƒ ์ด์Šˆ

    Next.js์˜ API Routes ๋Œ€๋ถ€๋ถ„ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ, ๋ฐฑ์—”๋“œ API ๊ฐœ๋ฐœ๋ณด๋‹ค ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ๋” ๋นจ๋ฆฌ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. API ๊ฐœ๋ฐœ ์™„๋ฃŒ ์ „ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” mockAPI๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Next.js์˜ API Routes ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ mockAPI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. pages/api ํด๋” ๋‚ด๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์€ ๋ชจ๋‘ /api/* ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. // api/reviews/[reviewId] import { NextApiRequest, NextApiResponse } from "next"; export default function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === "GET") { co..

    [Nextjs] Linking & Navigating

    Next ๋ผ์šฐํ„ฐ๋Š” ์„œ๋ฒ„ ์ค‘์‹ฌ์˜ ๋ผ์šฐํŒ…๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ๋กœ๋”ฉ ์ƒํƒœ์™€ concurrent ๋ Œ๋”๋ง์„ ์ง€์›ํ•œ๋‹ค. ์ฆ‰, ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์žฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ณ , ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ race condition์„ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปดํฌ๋„ŒํŠธ HTML ์š”์†Œ๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์œผ๋กœ prefetching๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค. Next์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜์— ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํŠน์ • ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. import Link from 'next/link'; export default function Page() { return Dashboard; } next/link์—์„œ importํ•ด์„œ href๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด..

    [NextJS] Pages, Layouts

    Next 13์€ pages, layouts, templates๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ปจ๋ฒค์…˜์„ ๋„์ž…ํ–ˆ๋‹ค. Pages page๋Š” route์— ์œ ์ผํ•œ UI์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. Layouts ์—ฌ๋Ÿฌ pages ๊ฐ„์— ๊ณต์œ ๋˜๋Š” UI์ด๋‹ค. layout์€ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜๊ณ , ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. layout.js ํŒŒ์ผ์—์„œ default export๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. child ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ child ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—, ํ•ญ์ƒ children props๋ฅผ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค. // app/dashboard/layout.tsx export default function DashboardLayout({ child..

    [NextJS] Routing

    React Router์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Next๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋ผ์šฐํŒ… app ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์˜ ํด๋”๋“ค์€ ์ž๋™์œผ๋กœ ๋ผ์šฐํŒ…๋œ๋‹ค. ํด๋” ๋‚ด๋ถ€์— page.js๊ฐ€ ์žˆ์–ด์•ผ URL ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. // dashboard/page.js export default function Page() { return ( Page ); } ์ค‘์ฒฉ ๋ผ์šฐํŒ… ํด๋”๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์ค‘์ฒฉ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์  ๋ผ์šฐํŒ… []๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋” ์ด๋ฆ„์„ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค. // app/blog/[slug]/page.js export default function Page({ params }) { return My Post; } params๋ฅผ ์‚ฌ์šฉํ•ด์„œ URL์— ์ง€์ •ํ•œ slug ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. /blog/a ๊ฒฝ..