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

    [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 ๊ฒฝ..

    [React Router][Webpack] ์ค‘์ฒฉ ๋ผ์šฐํŒ… ์‚ฌ์šฉ ์‹œ 404 Not Found ์˜ค๋ฅ˜

    React Router nested routes 404 Not Found Error React Router ์ค‘์ฒฉ ๋ผ์šฐํŒ… React Router๋กœ ์ค‘์ฒฉ ๋ผ์šฐํŒ…์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. import { Routes, Route } from 'react-router-dom'; function App() { return ( ... ); } React Router nested routes 404 Not Found Error /admin ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•œ ๋’ค ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค. ํ•˜์ง€๋งŒ /admin/all-problems ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•œ ๋’ค ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด 404 Not Found ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• script์˜ src๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค. index.html์˜ scrip..

    [typescript] ๋™์ ์œผ๋กœ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž… ์ง€์ •ํ•˜๊ธฐ

    const cache = {}; const add = (id: string, value: string) => { cache[id] = value; }; const remove = (id: string) => { delete cache[id]; }; cache ๊ฐ์ฒด์—๋Š” ๋™์ ์œผ๋กœ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค. 1. Record ์‚ฌ์šฉํ•˜๊ธฐ const cache: Record = {} Record์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” key์˜ ํƒ€์ž…, ๋‘๋ฒˆ์งธ์—๋Š” value์˜ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. Record ๊ฐ์ฒด์˜ ํ‚ค๊ฐ€ Keys, ๊ฐ’์€ Type์— ์ง€์ •ํ•˜์—ฌ ๊ฐ์ฒด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 2. index ํƒ€์ž… ์ง€์ • const cache: { [id: string]: string } = {}; ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ํƒ€์ž… ์‚ฌ์šฉ interface C..