๐ Next.js ๊ณต์ ๋ฌธ์ ํต์ฌ ์์ฝ ๋ฐ ์ค์ ๊ฐ์ด๋
๐ Next.js ๊ณต์ ๋ฌธ์ ํต์ฌ ์์ฝ ๋ฐ ์ค์ ๊ฐ์ด๋
์น ๊ฐ๋ฐ์ ์์ํ๋ฉด์ React๋ฅผ ํ์ฉํ ํ๋ ์์ํฌ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด, Next.js๋ ์ฌ์ค์ ํ์ค์
๋๋ค.
React์ ๋จ์ ์ ๋ณด์ํ๊ณ , ์์ฐ์ฑ์ ๊ทน๋ํํด์ฃผ๋ ์ต๊ณ ์ ์ ํ์ง์ฃ .
์ด๋ฒ ๊ธ์์๋ Next.js ๊ณต์ ๋ฌธ์๋ฅผ ํ๊ตญ์ด๋ก ์์ ํ ์ดํดํ๊ณ , ์ค๋ฌด์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
"๊ทธ๋ฅ ๋ฒ์ญ"์ด ์๋, ๊ฐ๋ฐ์ ์
์ฅ์์ ์ค์ ํ์ฉ์ ๋ง๊ฒ ํด์ํ ๊ฐ์ด๋์
๋๋ค.
โ Next.js๋ ์ด๋ค ํ๋ ์์ํฌ์ธ๊ฐ์?
Next.js๋ React ๊ธฐ๋ฐ์ ํ์คํ ์น ํ๋ ์์ํฌ์
๋๋ค.
React๋ง์ผ๋ก๋ ์ด๋ ค์ด ๋ถ๋ถ๋ค – ๋ผ์ฐํ
, ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง(SSR), ์ ์ ํ์ด์ง ์์ฑ(SSG), ์ด๋ฏธ์ง ์ต์ ํ, SEO, ์ฝ๋ ์คํ๋ฆฌํ
– ์ด ๋ชจ๋ ๊ฑธ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ์
๋๋ค.
๐งญ Next.js์ ํต์ฌ ๊ธฐ๋ฅ ํ๋์ ๋ณด๊ธฐ
๊ธฐ๋ฅ ์ค๋ช
๋ผ์ฐํ ์์คํ | ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ + ๋ ์ด์์, ์ค์ฒฉ ๋ผ์ฐํ , ์ค๋ฅ ์ฒ๋ฆฌ๊น์ง |
๋ ๋๋ง ๋ฐฉ์ | CSR, SSR, SSG, ISR + React Server Component์ Streaming๊น์ง ์ง์ |
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ | fetch API ์ต์ ํ + ์บ์ฑ + ์ฌ๊ฒ์ฆ(Revalidation) |
์คํ์ผ๋ง | CSS Modules, Tailwind CSS, Emotion ๋ฑ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ |
์ด๋ฏธ์ง ์ต์ ํ | ์๋ ๋ฆฌ์ฌ์ด์ง, ์นํฌ๋งท ์ง์ ๋ฑ Core Web Vitals ์ต์ ํ |
TypeScript ์ง์ | ๊ธฐ๋ณธ ๋ด์ฅ + ํฅ์๋ ํ์ ๊ฒ์ฌ ๋ฐ ์ค์ |
โ๏ธ App Router vs Pages Router
Next.js์๋ 2๊ฐ์ง ๋ผ์ฐํ ๋ฐฉ์์ด ์์ต๋๋ค.
1. App Router (์ต์ ๋ฐฉ์)
- app/ ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ
- Server Component, Streaming ์ง์
- ์๋ก์ด ํ๋ก์ ํธ์ ๊ฐ๋ ฅ ์ถ์ฒ
2. Pages Router (๊ธฐ์กด ๋ฐฉ์)
- pages/ ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ
- Next.js์ ์ ํต์ ์ธ ๊ตฌ์กฐ
- ๊ธฐ์กด ํ๋ก์ ํธ ์ ์ง๋ณด์ ์ ํ์ฉ
Tip: ๊ณต์ ๋ฌธ์๋ App Router๋ฅผ ๊ธฐ๋ณธ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๊ณ ์์ผ๋ฉฐ, ๋๋กญ๋ค์ด์ ํตํด Pages Router ๋ฌธ์๋ก ์ ํ๋ ๊ฐ๋ฅํฉ๋๋ค.
๐ง ์ฌ์ ์ง์ ์ฒดํฌ๋ฆฌ์คํธ
Next.js๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฐฐ์ฐ๊ธฐ ์ ์ ์๋ ๊ธฐ์ ์ ์๊ณ ์์ผ๋ฉด ์ดํด๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
- HTML/CSS ๊ธฐ๋ณธ
- JavaScript ES6 ๋ฌธ๋ฒ
- React ๊ธฐ์ด (์ปดํฌ๋ํธ, props, ์ํ ๋ฑ)
๐งฐ ์ค์ ์์ Next.js๋ฅผ ์ด๋ ๊ฒ ํ์ฉํฉ๋๋ค
# ํ๋ก์ ํธ ์์ฑ (App Router ๊ธฐ์ค)
npx create-next-app@latest my-app --typescript --app
// app/page.tsx (๊ธฐ๋ณธ ํ ํ์ด์ง)
export default function HomePage() {
return <h1>์๋
ํ์ธ์, Next.js!</h1>
}
// app/layout.tsx (๊ณตํต ๋ ์ด์์ ๊ตฌ์ฑ)
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body>{children}</body>
</html>
)
}
// app/api/hello/route.ts (๊ฐ๋จํ API)
export async function GET() {
return Response.json({ message: "Hello from API!" })
}
์ด๋ ๊ฒ Next.js๋ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ํตํฉ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
API ๋ผ์ฐํธ๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ ํ์ ์์ด, ํ๋์ ํ๋ก์ ํธ์์ ๋ฐฑ์๋ API๊น์ง ์ปค๋ฒํ ์ ์์ต๋๋ค.
๐งญ ๋ฌธ์ ํ์ฉ ํ
- ์ข์ธก ๋ฉ๋ด: ์ ์ฒด ๊ธฐ๋ฅ ๊ตฌ์กฐ ํ๋์ ๋ณด๊ธฐ
- ์ฐ์ธก ๋ฉ๋ด: ํด๋น ํ์ด์ง ์น์ ๋ฐ๋ก๊ฐ๊ธฐ
- Ctrl+K ๋๋ Cmd+K: ๊ฒ์ ์ฐฝ ํธ์ถ
- ์์ ์ฝ๋: ๋ณต๋ถํด์ ๋ฐ๋ก ํ ์คํธ ๊ฐ๋ฅ
๐ ์ค์ ์์ ์ด๋ฐ ์ฉ๋๋ก ์ฌ์ฉํ์ธ์
์ฌ์ฉ ์๋๋ฆฌ์ค ์ ์ฉ ๋ฐฉ์
ํฌํธํด๋ฆฌ์ค ์น์ฌ์ดํธ | ์ ์ ํ์ด์ง (SSG) ๊ธฐ๋ฐ ๋ฐฐํฌ |
๋ธ๋ก๊ทธ | MDX + App Router๋ก SSR/ISR ์ ์ฉ |
๋์๋ณด๋ | ์๋ฒ ์ปดํฌ๋ํธ + ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํผํฉ |
API ์๋ฒ | app/api/ ๋๋ ํ ๋ฆฌ๋ก ๋ด๋ถ API ๊ตฌ์ถ |
๐ง๐ป ๋น์ ์ด ์ง๊ธ ํด์ผ ํ ๊ฒ
- create-next-app์ผ๋ก ํ๋ก์ ํธ ์์ฑ
- app/ ๊ตฌ์กฐ ์ดํดํ๋ฉฐ ๊ฐ๋จํ ํ์ด์ง ๋ง๋ค์ด๋ณด๊ธฐ
- API ๋ผ์ฐํธ ์ค์ต
- ์ ์ /๋์ ๋ ๋๋ง ๋น๊ตํด๋ณด๊ธฐ
๐ ๋ง๋ฌด๋ฆฌ
Next.js๋ ์ด์ ๋จ์ํ React ๋ณด์กฐ ๋๊ตฌ๋ฅผ ๋์ด, ์์ฑ๋ ๋์ ์น ํ๋ซํผ์
๋๋ค.
๊ณต์ ๋ฌธ์๊ฐ ์ ๋์ด ์์ง๋ง, ๋๋ฌด ๋ฐฉ๋ํ ๋งํผ ํต์ฌ ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ดํดํ๊ณ ๋จ๊ณ๋ณ๋ก ์ ๊ทผํ๋ ๊ฒ ์ค์ํฉ๋๋ค.
์์ผ๋ก ์ค์ ํ๋ก์ ํธ๋ฅผ Next.js๋ก ์งํํ ๊ณํ์ด๋ผ๋ฉด, ์ด ๊ธ์ด ๊ตฌ์กฐ์ ์ธ ์ดํด์ ์ฒซ ๊ฑธ์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
์ถํ ์๋ฆฌ์ฆ๋ก App Router ๊ตฌ์กฐ ํด๋ถ, ์๋ฒ ์ปดํฌ๋ํธ์ ์บ์ฑ ์ ๋ต, **Next.js๋ก ์์ฑํ๋ ๋ธ๋ก๊ทธ ํ๋ก์ ํธ**๋ ๋ค๋ฃฐ ์์ ์
๋๋ค.
Next.js, React, ์น๊ฐ๋ฐ, ํ์คํ, App Router, ์ ์ ์ฌ์ดํธ, ์๋ฒ์ฌ์ด๋๋ ๋๋ง, ์นํ๋ ์์ํฌ, TypeScript