๐ Next.js App Router ์ค์น ๋ฐ ํ๋ก์ ํธ ์์ ๊ฐ์ด๋
๐ Next.js App Router ์ค์น ๋ฐ ํ๋ก์ ํธ ์์ ๊ฐ์ด๋
Next.js๋ React ๊ธฐ๋ฐ์ ํ์คํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ก, ์ต์ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ์ฌ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ง์ํฉ๋๋ค. ์ด๋ฒ ๊ฐ์ด๋์์๋ Next.js์ App Router๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
โ ์์คํ ์๊ตฌ ์ฌํญ
- Node.js:๋ฒ์ 18.18 ์ด
- ์ด์ ์ฒด์ :macOS, Windows(WSL ํฌํจ), ๋๋ Linu
โ๏ธ ์๋ ์ค์น: create-next-app ์ฌ์ฉํ๊ธฐ
Next.js์์๋ create-next-app CLI๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
1. ํ๋ก์ ํธ ์์ฑ
npx create-next-app@latest
์คํ ํ, ์๋์ ๊ฐ์ ํ๋กฌํํธ๊ฐ ๋ํ๋ฉ๋๋ค:
- ํ๋ก์ ํธ ์ด๋ฆ ์ ๋ ฅ
- TypeScript ์ฌ์ฉ ์ฌ๋ถ
- ESLint ์ฌ์ฉ ์ฌ๋ถ
- Tailwind CSS ์ฌ์ฉ ์ฌ๋ถ
- src/ ๋๋ ํ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ
- App Router ์ฌ์ฉ ์ฌ๋ถ (๊ถ์ฅ)
- Turbopack ์ฌ์ฉ ์ฌ๋ถ
- import alias ์ค์ ์ฌ๋ถ
์ ํ์ ๋ฐ๋ผ ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ ํ์ํ ์์กด์ฑ์ด ์ค์น๋ฉ๋๋ค.
๐ ๏ธ ์๋ ์ค์น: ์ง์ ์ค์ ํ๊ธฐ
์ง์ ํ๋ก์ ํธ๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
1. ํ์ ํจํค์ง ์ค์น
npm install next@latest react@latest react-dom@latest
2. package.json ์คํฌ๋ฆฝํธ ์ถ๊ฐ
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
}
}
3. ๋๋ ํ ๋ฆฌ ๋ฐ ํ์ผ ๊ตฌ์กฐ ์ค์
app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body>{children}</body>
</html>
);
}
app/page.tsx
export default function Page() {
return <h1>Hello, Next.js!</h1>;
}
๐ผ๏ธ ์ ์ ์์ฐ ๊ด๋ฆฌ: public ํด๋ ์ฌ์ฉ (์ ํ ์ฌํญ)
ํ๋ก์ ํธ ๋ฃจํธ์ public ํด๋๋ฅผ ์์ฑํ์ฌ ์ด๋ฏธ์ง, ํฐํธ ๋ฑ์ ์ ์ ์์ฐ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, public/profile.png ํ์ผ์ ์ฝ๋์์ /profile.png๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
import Image from 'next/image';
export default function Page() {
return <Image src="/profile.png" alt="Profile" width={100} height={100} />;
}
๐ ๊ฐ๋ฐ ์๋ฒ ์คํ
- ๊ฐ๋ฐ ์๋ฒ ์์:
npm run dev
- ๋ธ๋ผ์ฐ์ ์์ http://localhost:3000 ์ ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ํ์ธ
- app/page.tsx ํ์ผ์ ์์ ํ๊ณ ์ ์ฅํ์ฌ ๋ณ๊ฒฝ ์ฌํญ ํ์ธ
๐งฉ TypeScript ์ค์
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก TypeScript๋ฅผ ์ง์ํฉ๋๋ค. .ts ๋๋ .tsx ํ์ผ์ ์์ฑํ๊ณ next dev๋ฅผ ์คํํ๋ฉด ํ์ํ ์์กด์ฑ์ด ์๋์ผ๋ก ์ค์น๋๊ณ tsconfig.json ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๐งน ESLint ์ค์
ESLint๋ ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. create-next-app์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ค์ ๋๋ฉฐ, ์๋์ผ๋ก ์ค์ ํ๋ ค๋ฉด ๋ค์์ ๋ฐ๋ฅด์ธ์:
- package.json์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ:
{
"scripts": {
"lint": "next lint"
}
}
- ESLint ์คํ:
npm run lint
ํ๋กฌํํธ์ ๋ฐ๋ผ ์ค์ ์ ์๋ฃํ๋ฉด .eslintrc.json ํ์ผ์ด ์์ฑ๋๊ณ , ์ ํํ ๊ตฌ์ฑ์ ๋ฐ๋ผ eslint ๋ฐ eslint-config-next ํจํค์ง๊ฐ ์ค์น๋ฉ๋๋ค.
๐ฆ ์ ๋ ๊ฒฝ๋ก ๋ฐ ๋ชจ๋ ๊ฒฝ๋ก ๋ณ์นญ ์ค์
tsconfig.json ๋๋ jsconfig.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ์ฌ ์ ๋ ๊ฒฝ๋ก ๋ฐ ๋ชจ๋ ๊ฒฝ๋ก ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
{
"compilerOptions": {
"baseUrl": "src/",
"paths": {
"@/components/*": ["components/*"],
"@/styles/*": ["styles/*"]
}
}
}
์ด๋ ๊ฒ ์ค์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ๋ชจ๋์ importํ ์ ์์ต๋๋ค:
import { Button } from '@/components/button';
๐งช ํ๋ก์ ํธ ํ ์คํธ
์ค์ ์ด ์๋ฃ๋๋ฉด ๋ค์ ๋ช ๋ น์ด๋ก ํ๋ก์ ํธ๋ฅผ ์คํํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค:
npm run dev
๋ธ๋ผ์ฐ์ ์์ http://localhost:3000 ์ ์ํ์ฌ "Hello, Next.js!" ๋ฉ์์ง๋ฅผ ํ์ธํ์ธ์.
Next.js, App Router, React, ์น ๊ฐ๋ฐ, ํ์คํ, TypeScript, ESLint, Tailwind CSS, ํ๋ก์ ํธ ์ค์ , ์ ์ ์์ฐ ๊ด๋ฆฌ