ํ ์ ํฌ๊ธฐ๋ก ์๋ผ๋จน๋ Next.js ํ์ต์ ๋ฆฌ์ฉ์ ๋๋ค.
4.1) ์ฑ ๋ผ์ฐํฐ์ ๋ฐ์ดํฐ ํ์นญ
Page Router์ ๋ฐ์ดํฐ ํ์นญ
Parge Router์์๋ ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๊ธฐ ์ํด์ ํน์ ํจ์๋ค์ ์ฌ์ฉํ๋ค.
(GetServerSideProps, GetStaticProps, GetStaticPath ๋ฑ)
์ ํจ์๋ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ page component์ ๋ฐ์ดํฐ๋ฅผ Props๋ก ์ ๋ฌํด์ฃผ์๋ค.
page router์์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ด๊ธฐ ๋๋ฌธ์ page component ์ญ์ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ๋ฌํ ํจ์๋ค์ page component์ ์์ฑํ ์ ์์๋ค.
page router์ data fetching์ ๋จ์
ํ์ด์ง ์ปดํฌ๋ํธ์๊ฒ๋ง ๋ฐ์ดํฐ๊ฐ props๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์๊ฒ props๋ก ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ณด๋ด์ค์ผํ๋ ๋ฌธ์ ์ ์ด ์๋ค.
ํ์ง๋ง App Router์์๋ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์ถ๊ฐ๋์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
App Router์ ๋ฐ์ดํฐ ํ์นญ
App Router์์๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ์ฌ page component์์๋ ๋ฐ์ดํฐ ํ์นญ์ด ๊ฐ๋ฅํ๋ค.
์ค์ง ์๋ฒ์์๋ง ์คํ๋๊ธฐ ๋๋ฌธ์ ํจ์์ async ํค์๋๋ฅผ ๋ถ์ด๋๊ฒ ๊ฐ๋ฅํ๋ฐ, ๋ฐ๋ผ์ ์ปดํฌ๋ํธ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ๋ง๋ค๊ณ ๋ด๋ถ์์ await ํค์๋์ fetch ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค.
export async function Page(props) {
const data = await fetch('...');
return <div>...</div>
}
์ด๋ก์จ page router์์ ์ฌ์ฉํ๋ GetServerSideProps, GetStaticProps, GetStaticPath ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ํ์๋กํ๋ ์ปดํฌ๋ํธ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ props๋ก ๋๊ฒจ์ค๋ค๋๊ฐ ๊ทธ๋ฌ์ง ์์๋ ๊ด์ฐฎ๋ค.
// ์ฌ์ฉ์์
async function AllBooks() {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERBER_URL}/book`
);
if (!response.ok) {
return <div>์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค ...</div>;
}
const allBooks: BookData[] = await response.json();
return (
<div>
{allBooks.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
import BookItem from "@/components/book-item";
import { BookData } from "@/types";
export default async function Page({
searchParams,
}: {
searchParams: { q?: string };
}) {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERBER_URL}/book/search?q=${searchParams.q}`
);
if (!response.ok) {
return <div>์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค ...</div>;
}
const books: BookData[] = await response.json();
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
import { BookData } from "@/types";
import style from "./page.module.css";
export default async function Page({
params,
}: {
params: { id: string | string[] };
}) {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERBER_URL}/book/${params.id}`
);
if (!response.ok) {
return <div>์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค ...</div>;
}
const bookData: BookData = await response.json();
const { title, subTitle, description, author, publisher, coverImgUrl } =
bookData;
return (
<div className={style.container}>
<div
className={style.cover_img_container}
style={{ backgroundImage: `url('${coverImgUrl}')` }}
>
<img src={coverImgUrl} />
</div>
<div className={style.title}>{title}</div>
<div className={style.subTitle}>{subTitle}</div>
<div className={style.author}>
{author} | {publisher}
</div>
<div className={style.description}>{description}</div>
</div>
);
}
'FE > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js] App Router - ๋ค๋น๊ฒ์ดํ (0) | 2025.05.08 |
---|---|
[Next.js] ๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ (2) | 2025.05.07 |
[Next.js] App Router - ๋ ์ด์์ (0) | 2025.05.06 |
[Next.js] App Router - ํ์ด์ง ๋ผ์ฐํ (0) | 2025.05.06 |
[Next.js] Page Router ์ฅ๋จ์ (0) | 2025.05.06 |