🎨 ν”„λ‘ νŠΈμ—”λ“œ 🌿 쀑급

Next.js 14 ν’€μŠ€νƒ

Next.js App Router둜 ν’€μŠ€νƒ 개발

⏱️ 15μ‹œκ°„ πŸ‘οΈ 43 쑰회
🎬 μ˜μƒ κ°•μ’Œ
πŸ“– κ°•μ’Œ λ‚΄μš©
# Next.js 14 ν’€μŠ€νƒ 개발

## 1. Next.jsλž€?
React 기반 ν’€μŠ€νƒ ν”„λ ˆμž„μ›Œν¬. SSR, SSG, API Routes 지원.

## 2. ν”„λ‘œμ νŠΈ 생성
```bash
npx create-next-app@latest myapp
cd myapp
npm run dev
```

## 3. App Router ꡬ쑰
```
app/
β”œβ”€β”€ layout.tsx # 루트 λ ˆμ΄μ•„μ›ƒ
β”œβ”€β”€ page.tsx # ν™ˆ νŽ˜μ΄μ§€ (/)
β”œβ”€β”€ about/
β”‚ └── page.tsx # /about
β”œβ”€β”€ blog/
β”‚ β”œβ”€β”€ page.tsx # /blog
β”‚ └── [slug]/
β”‚ └── page.tsx # /blog/:slug
└── api/
└── users/
└── route.ts # API /api/users
```

## 4. μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ (κΈ°λ³Έ)
```tsx
// app/posts/page.tsx - μ„œλ²„μ—μ„œ μ‹€ν–‰
async function PostsPage() {
const posts = await fetch("https://api.example.com/posts").then(r => r.json());

return (
<ul>
{posts.map(post => <li key={post.id}>{post.title}</li>)}
</ul>
);
}
export default PostsPage;
```

## 5. ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ
```tsx
"use client";
import { useState } from "react";

export default function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
```

## 6. λ ˆμ΄μ•„μ›ƒ
```tsx
// app/layout.tsx
export default function RootLayout({ children }) {
return (
<html lang="ko">
<body>
<nav>My Site</nav>
{children}
<footer>Copyright 2024</footer>
</body>
</html>
);
}
```

## 7. API Routes
```ts
// app/api/users/route.ts
import { NextResponse } from "next/server";

export async function GET() {
const users = await db.user.findMany();
return NextResponse.json(users);
}

export async function POST(request: Request) {
const body = await request.json();
const user = await db.user.create({ data: body });
return NextResponse.json(user, { status: 201 });
}
```

## 8. 동적 라우트
```tsx
// app/blog/[slug]/page.tsx
export default async function BlogPost({ params }) {
const post = await getPost(params.slug);
return <article>{post.content}</article>;
}

// 정적 생성
export async function generateStaticParams() {
const posts = await getPosts();
return posts.map(post => ({ slug: post.slug }));
}
```

## 9. Server Actions
```tsx
// app/actions.ts
"use server";

export async function createPost(formData: FormData) {
const title = formData.get("title");
await db.post.create({ data: { title } });
revalidatePath("/posts");
}

// μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©
<form action={createPost}>
<input name="title" />
<button type="submit">Create</button>
</form>
```

## 10. 미듀웨어
```ts
// middleware.ts
import { NextResponse } from "next/server";

export function middleware(request) {
const token = request.cookies.get("token");
return NextResponse.redirect(new URL("/login", request.url));
}
return NextResponse.next();
}

export const config = { matcher: ["/admin/:path*"] };
```