๐ Next.js๋ก API ๋ง๋ค๊ธฐ: ์ฝ๊ณ ๊น๋ํ ๋ฐฑ์๋ ๊ตฌ์ถ๋ฒ ๐ก
Next.js๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)์ ๊ฐ์ ์ ๊ฐ์ง React ํ๋ ์์ํฌ๋ก ๋๋ฆฌ ์๋ ค์ ธ ์์ง๋ง, ์ฌ์ค API ๊ตฌ์ถ์๋ ๋๋ผ์ด ๋ฅ๋ ฅ์ ์๋ํฉ๋๋ค. ๐
Next.js๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์๋ฒ ์ค์ ์์ด๋ ๋ฐฑ์๋ API๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ค๋์ Next.js๋ก API๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ด๋ถํฐ ์ค๋ฌด ํ์ฉ๊น์ง ๊ฝ๊ฝ ๋๋ฌ ๋ด์ ์์๋ณด๊ฒ ์ต๋๋ค! ๐งณ
๐ Next.js API์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
Next.js์์๋ API๋ฅผ ์ํ ๋ณ๋์ ์๋ฒ๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค. /pages/api ํด๋์ ํ์ผ์ ์ถ๊ฐํ๋ฉด ํด๋น ํ์ผ์ด ๊ณง API ์๋ํฌ์ธํธ๋ก ๋์ํฉ๋๋ค.
๐๏ธ ํด๋ ๊ตฌ์กฐ
my-next-app/
โโโ pages/
โ โโโ api/
โ โ โโโ hello.js // ๊ธฐ๋ณธ API ํ์ผ
โ โ โโโ users.js // ์ฌ์ฉ์ ๋ฐ์ดํฐ API
โ โ โโโ posts/
โ โ โ โโโ index.js // ๊ฒ์๋ฌผ ๋ชฉ๋ก API
โ โ โ โโโ [id].js // ํน์ ๊ฒ์๋ฌผ API
• **/pages/api/hello.js**๋ http://localhost:3000/api/hello๋ก ์ ๊ทผํ ์ ์๋ API๊ฐ ๋ฉ๋๋ค.
๐ง API ๊ธฐ๋ณธ ์ฝ๋
Hello API ๋ง๋ค๊ธฐ
/pages/api/hello.js ํ์ผ์ ๋ง๋ค์ด ๊ฐ๋จํ ์๋ต์ ๋ณด๋ด๋ API๋ฅผ ์์ฑํด๋ด ์๋ค.
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ message: "Hello, Next.js API!" });
}
• req: ํด๋ผ์ด์ธํธ ์์ฒญ ๊ฐ์ฒด.
• res: ์๋ฒ ์๋ต ๊ฐ์ฒด.
๐ ์ด API๋ ๋ค์๊ณผ ๊ฐ์ JSON ์๋ต์ ๋ฐํํฉ๋๋ค:
{
"message": "Hello, Next.js API!"
}
๐ HTTP ๋ฉ์๋ ๋ค๋ฃจ๊ธฐ
Next.js API๋ GET, POST, PUT, DELETE ๋ฑ ๋ค์ํ HTTP ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Users API
/pages/api/users.js๋ฅผ ์์ฑํ์ฌ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ๋ API๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
export default function handler(req, res) {
const { method } = req;
switch (method) {
case "GET":
res.status(200).json({ users: ["Alice", "Bob", "Charlie"] });
break;
case "POST":
const { name } = req.body;
res.status(201).json({ message: `User ${name} created!` });
break;
default:
res.setHeader("Allow", ["GET", "POST"]);
res.status(405).end(`Method ${method} Not Allowed`);
}
}
์์ฒญ ๋ฐ ์๋ต ์์
1. GET ์์ฒญ:
• URL: http://localhost:3000/api/users
• ์๋ต:
{
"users": ["Alice", "Bob", "Charlie"]
}
2. POST ์์ฒญ:
• URL: http://localhost:3000/api/users
• Body: { "name": "Dave" }
• ์๋ต:
{
"message": "User Dave created!"
}
๐ ๏ธ ๋์ ๋ผ์ฐํ ๊ณผ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ
Next.js API์์๋ ํ์ผ๋ช ์ผ๋ก ๋์ ๋ผ์ฐํ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฒ์๋ฌผ API
/pages/api/posts/[id].js๋ฅผ ์์ฑํ์ฌ ํน์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ API๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
export default function handler(req, res) {
const { id } = req.query;
if (req.method === "GET") {
res.status(200).json({ postId: id, content: `Content of post ${id}` });
} else {
res.setHeader("Allow", ["GET"]);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
์์ฒญ ๋ฐ ์๋ต ์์
1. GET ์์ฒญ:
• URL: http://localhost:3000/api/posts/123
• ์๋ต:
{
"postId": "123",
"content": "Content of post 123"
}
๐ API ๋ณด์: ํ๊ฒฝ ๋ณ์์ ์ธ์ฆ ์ฒ๋ฆฌ
ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
Next.js์์๋ **process.env**๋ฅผ ์ฌ์ฉํด ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
1. ํ๊ฒฝ ๋ณ์ ์ค์
.env.local ํ์ผ ์์ฑ:
API_KEY=your-secret-api-key
2. API์์ ์ฌ์ฉ
export default function handler(req, res) {
const apiKey = process.env.API_KEY;
res.status(200).json({ apiKey });
}
JWT ์ธ์ฆ ์ฒ๋ฆฌ
๊ฐ๋จํ JWT ์ธ์ฆ์ API์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
import jwt from "jsonwebtoken";
export default function handler(req, res) {
const { authorization } = req.headers;
if (!authorization) {
return res.status(401).json({ error: "No token provided" });
}
try {
const token = authorization.split(" ")[1];
const decoded = jwt.verify(token, process.env.JWT_SECRET);
res.status(200).json({ message: "Authenticated!", user: decoded });
} catch (err) {
res.status(401).json({ error: "Invalid token" });
}
}
โก ์ค๋ฌด ํ์ฉ ์์: ํด๋ผ์ด์ธํธ์์ API ํธ์ถํ๊ธฐ
API ํธ์ถ ์ฝ๋ (React ์ปดํฌ๋ํธ)
import { useEffect, useState } from "react";
export default function Users() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch("/api/users")
.then((res) => res.json())
.then((data) => setUsers(data.users));
}, []);
return (
<ul>
{users.map((user, index) => (
<li key={index}>{user}</li>
))}
</ul>
);
}
๐ Next.js API์ ์ฅ์
1. ์ค์ ๊ฐ์ํ: ๋ณ๋์ ์๋ฒ ์ค์ ์์ด API๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
2. ํด๋ ๊ธฐ๋ฐ ๋ผ์ฐํ : ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ผ์ฐํธ๋ฅผ ์ง๊ด์ ์ผ๋ก ๊ด๋ฆฌ.
3. SSR๊ณผ ํตํฉ: API์ ์๋ฒ ๋ ๋๋ง์ ์์ฐ์ค๋ฝ๊ฒ ๊ฒฐํฉ ๊ฐ๋ฅ.
4. ํ๊ฒฝ ๋ณ์ ์ง์: ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌ.
5. ๋ฌดํ ํ์ฅ ๊ฐ๋ฅ: ๊ฐ๋จํ ํ๋ก์ ํธ๋ถํฐ ๋ณต์กํ ๋ฐฑ์๋๊น์ง ๋์ ๊ฐ๋ฅ.
๐ ๋ง๋ฌด๋ฆฌ
Next.js์ API๋ ๋ฐฑ์๋ ์ค์ ์ ๋ณต์กํจ ์์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฐฑ์๋ ๋ก์ง๊น์ง ๋ค๋ฃฐ ์ ์๋ ์๋, ์ด์ Next.js๋ก ์์ํด๋ณด์ธ์! ๐
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น!๐ท
'Front-end > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ Next.js์ Static Generation: ์ ์ ์์ฑ์ ๋ชจ๋ ๊ฒ ๐ผ๏ธ (0) | 2025.02.20 |
---|---|
Next.js์ useRouter ์์ ์ ๋ณต: ๋ผ์ฐํ ์ ํต์ฌ ์ดํดํ๊ธฐ (1) | 2025.02.15 |
[Next] SSG(Static Site Generation)๋? ๐ (1) | 2025.02.01 |