Next.js serverμ clientμ λ€λ₯Έ fetch...
π μλ²(Server)μμλ URLμ΄ νμ μλ μ΄μ
Next.js μλ²λ λ°°μ½λ νκ²½(Node.js)μμ μ€νλκΈ° λλ¬Έμ, μλ² λ΄λΆμμ APIλ₯Ό νΈμΆν λλ μ λ URLμ΄ νμνμ§ μμ.
μλ κ²½λ‘(/api/something)λ§ μ¬μ©ν΄λ μμ²μ μ²λ¦¬ν μ μλ€.
μμ μ½λ
// pages/api/example.ts
export default function handler(req, res) {
res.status(200).json({ message: "Hello from API!" });
}
// pages/index.tsx (μλ²μμ μ€ν)
export async function getServerSideProps() {
const res = await fetch(`/api/example`); // μ λ URL λΆνμ
const data = await res.json();
return { props: { data } };
}
μ΄μ
fetch("/api/example")νλ©΄ Next.js μλ² λ΄λΆμμ μ²λ¦¬λλ κ²μ΄κΈ° λλ¬Έμ, μ λ URL μμ΄ μλ κ²½λ‘λ§μΌλ‘ μμ² κ°λ₯.- API λΌμ°νΈ(
/api/*)λ Next.js μλ²κ° μ§μ μ²λ¦¬νλ κ²μ΄κΈ° λλ¬Έμ, μμ²μ μΈλΆ λ€νΈμν¬λ‘ 보λ΄μ§ μμ.
π ν΄λΌμ΄μΈνΈ(Client)μμλ URLμ΄ νμν μ΄μ
ν΄λΌμ΄μΈνΈλ λΈλΌμ°μ μμ μ€νλλλ°, API μμ²μ ν λλ μ λ URLμ΄ νμνλ€.
fetchλ₯Ό μ¬μ©ν λ http://localhost:3000/api/something λλ λ°°ν¬λ λλ©μΈ(μ: https://myapp.com/api/something)μ λͺ
μν΄μΌ νλ€.
μμ μ½λ
// components/Example.tsx (ν΄λΌμ΄μΈνΈμμ μ€ν)
import { useEffect, useState } from "react";
export default function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch("http://localhost:3000/api/example") // μ λ URL νμ
.then((res) => res.json())
.then((data) => setData(data));
}, []);
return <div>{data ? data.message : "Loading..."}</div>;
}
μ΄μ
- λΈλΌμ°μ λ Next.js μλ²μ λΆλ¦¬λ νκ²½μμ μ€νλκΈ° λλ¬Έμ, API νΈμΆμ **μ νν μ£Όμ(μ λ URL)**κ° νμν¨.
- ν΄λΌμ΄μΈνΈμμ
fetch("/api/example")λ§ μ¬μ©νλ©΄, νμ¬ νμ΄μ§ URL κΈ°μ€μΌλ‘ μμ²ν΄μ κ²½λ‘κ° κΌ½μΌ μ μμ. - λ°°ν¬λ νκ²½μμλ
localhostκ° μλλΌ μ€μ λλ©μΈ(https://myapp.com/api/something)μ μ¬μ©ν΄μΌ νκΈ° λλ¬Έ.
β μ 리
| μ€ν νκ²½ | URL νμ μ¬λΆ | μ΄μ |
|---|---|---|
μλ² (Next.js API, getServerSideProps) | β νμ μμ | μλ² λ΄λΆμμ μ€νλλλ° μλ κ²½λ‘ μ¬μ© κ°λ₯ |
ν΄λΌμ΄μΈνΈ (React μ»΄ν¬λνΈ, useEffect) | β νμν¨ | λΈλΌμ°μ μμ API νΈμΆν λ μ λ URL νμ |
λκΈ
μμ§ λκΈμ΄ μμ΄μ. 첫 λκΈμ λ¨κ²¨λ³΄μΈμ.