# 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*"] };
```