๐ฉ๐ค ํ๋ก ํธ์๋
[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..