ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ ๋ฆฌํฉํ ๋ง์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ ๋ด์์ async/await์ผ๋ก ์ฌ์ฉ์ค์ธ ๊ฒ๋ค์ use()๋ก ๋ณ๊ฒฝ์ ํ๋ ์์ค์ use()๊ฐ ์ ์ฉ์ด ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์๋๋ฐ,
๊ทธ๊ฑด ๋ฐ๋ก metadata๋ฅผ ์ค์ ํ๊ณ ์๋ generateMetadata()์์์ ์ฌ์ฉ์ด์๋ค...
export function generateMetadata({
params,
}: {
params: { id: string };
}): Promise<Metadata> {
const id = params?.id;
const champion = use(fetchChampionDetail(id));
if (!champion) {
return {
title: "์ ์ ์๋ ์ฑํผ์ธ",
description: "์ฑํผ์ธ ์ ๋ณด๊ฐ ์์ต๋๋ค",
};
}
return {
title: `${champion.title + " " + champion.name}์ ์์ธ ํ์ด์ง`,
description: `${champion.lore}`,
};
}
use()๋ถ๋ถ์ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ํ๋๊ฒ ๋์๋๋ฐ..
์ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ์ธ์ง
์ฐ์ use()์ ๋ํด์ ์ข๋ ์์๋ณด์!
React Hook "use" is called in function "generateMetadata" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word "use"
React์ use()๋ Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํจ์นญ ๋ฉ์๋๋ก ๋ง์ด ์ฌ์ฉ๋๋ async/await์ ๋น์ทํ ์ญํ ์ ํ์ง๋ง ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
| ๊ตฌ๋ถ | use(fetch()) | await fetch() |
|---|---|---|
| ์ฌ์ฉ ์์น | ์๋ฒ ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ๊ฐ๋ฅ | ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅ |
| ๋ ๋๋ง ์์ | ์ปดํฌ๋ํธ ๋ ๋๋ง ์ค ์คํ๋จ | ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ์คํ๋จ |
| Suspense ์ง์ | โ ์๋ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ | โ ์ง์ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ ํ์ |
| ์๋ ์บ์ฑ | โ RSC ๊ธฐ๋ฅ์ผ๋ก ์๋ ์บ์ฑ | โ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์ฑ ์ ๋จ |
| ์ฝ๋ ๊ฐ๊ฒฐํจ | โ ์ ์ธ์ ์ด๊ณ ๊ฐ๊ฒฐ | โ ์ถ๊ฐ์ ์ธ ์ํ ๊ด๋ฆฌ ํ์ |
"use server";
export async function fetchChampion() {
const res = await fetch("xxxx")
return res.json()
}
// โ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์๋ฌ ๋ฐ์!
const champion = use(fetchChampion()); // โ ์๋ฌ!
๐ฅ ์์ ๊ฐ์ด ์์ฑ์ ์ค๋ฅ ๋ฐ์
use()๋ React์ ๋ ๋๋ง ์ค์ ์คํ๋๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ์ฌ์ฉํด์ผ ํจconst ChampionComponent = () => {
const champion = use(fetchChampion()); // โ
์ ์ ์๋!
return <h1>{champion.name}</h1>;
};
๐น ์์ ๊ฐ์ด ์ปดํฌ๋ํธ ์ use client๋ด๋ถ์์ ์ฌ์ฉํด์ผ ์ ์์ ์ผ๋ก ๋์ํจ
gernerateMetadata()๋ React ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ Next.js์ ์๋ฒ ํจ์์ด๊ธฐ ๋๋ฌธ!use()๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.๊ฒฐ๊ตญ์ ๋๊ณ ๋์์ async/await ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ํ์๋ค.
export async function generateMetadata({
params,
}: {
params: { id: string };
}): Promise<Metadata> {
const id = params?.id;
const champion = await fetchChampionDetail(id);
if (!champion) {
return {
title: "์ ์ ์๋ ์ฑํผ์ธ",
description: "์ฑํผ์ธ ์ ๋ณด๊ฐ ์์ต๋๋ค",
};
}
โก ์ด๋ ๊ฒ await์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฌธ์ ์์ด ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค
โ ๏ธ ์ ๊น
๊ทธ๋ ๋ค๋ฉด ์ธ์
use()๋ฅผ ์ฐ๊ณ , ์ธ์ await fetch()๋ฅผ ์จ์ผํ ๊น?
use server) ๋๋ API ๋ผ์ฐํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋| ํญ๋ชฉ | use(fetch()) | await fetch() |
|---|---|---|
| ์ฌ์ฉ๋ฒ | use(fetch()) | await fetch() |
| ์ฌ์ฉ ์์น | ์๋ฒ ์ปดํฌ๋ํธ ๋ด๋ถ | ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅ |
| ๋ ๋๋ง ๋ฐฉ์ | React ๋ ๋๋ง ์ค ์คํ | ๋ช ์์ ์ผ๋ก ์คํ |
| Suspense ์ง์ | โ ๊ฐ๋ฅ | โ ์ง์ ๊ด๋ฆฌ ํ์ |
| ์๋ ์บ์ฑ | โ ์ง์ | โ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ |
use()๋ฅผ ์ฐ๋ฉด ๋ ๊น๋ํ๊ณ ํจ์จ์ await fetch()๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ