๐ก๋ ธ๋ง๋์ฝ๋ ๋๊ผฌ์ค์ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถํ๋ ์๋ฆฌ์ฆ์ ๋๋ค.
์ฌ๋ฌ ํ์ด์ง์์ ๋์ผํ layout์ ์ฌ์ฉํ ์ ์๋๋ก component๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ฅ.
๋จ์ผ ๋ ์ด์์์ ์ฌ์ฉํ๋ค๋ฉด ์ต์์layoutํ์ผ
์ component๋ฅผ importํ์ฌ ๊ตฌ์ฑํ๊ณ , ํ์ด์ง๋ณ๋ก ๋ค๋ฅธ ๋ ์ด์์์ ์ฌ์ฉํด์ผํ๋ค๋ฉด ๊ฐํ์ด์ง๋ง๋ค layoutํ์ผ
์ ์ถ๊ฐํ๋ค.
Next๋ layout์ ๋จผ์ ํ์ธ ํ๊ณ , layout ์ปดํฌ๋ํธ์ children prop์ page๋ก renderํ๋ค.
//์ต์์ layout
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
<h1>์ต์์ ๋ ์ด์์</h1>
{children}
</body>
</html>
);
}
Next์์ layout์ด ์ฌ๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ ์์๋๋ ๊ฒ์ด ์๋๋ผ ์ค์ฒฉ๋๋ค.
์๋ฅผ๋ค์ด ์ต์์ layout๋ง๊ณ ๋ aboutํด๋
์ layout์ด ๋ ์๋ค๋ฉด, ๋๊ฐ์ ๋ ์ด์์์ด ๋์์ ๋ณด์ฌ์ง๋ค.
โปํ์ ๋ ์ด์์์ ์์ฑํ ๋๋ html, body๊ฐ ์๋ div
๋ก component๋ฅผ ๊ฐ์ธ์ผํ๋ค.
//aboutํด๋ layout.tsx์ถ๊ฐ
export default function Layout({
children,
}: {
children: React.ReactNode;
}) {
return (
<div>
<h1>ํ์ ๋ ์ด์์</h1>
{children}
</div>
);
}
aboutํด๋
์ ์ถ๊ฐํ layout์ด ์ค์ฒฉ๋์ด ๋ณด์ฌ์ง๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
Next๋ rout-group์ด๋ผ๋ ์ฌ๋ฏธ๋ ๊ธฐ๋ฅ์ด ์๋ค. ์ด๊ฒ์ pageํ์ผ
์๋ง ํ์ ๋ ๊ฒ์ธ๋ฐ,
(๊ดํธfoloer)
๋ฅผ ๋ง๋ค์ด ๊ทธ ์์ผ๋ก ์ฎ๊ฒจ๋ url์๋ ์๋ฌด๋ฐ ๋ณํ ์์ด ์๋ํ๋ค.
Next์ metadata๋ ๋ณํฉ๋๋ค.
์ต์์ layout
ํ์ผ์ ์๋จ์๋ metadata๊ฐ ์กด์ฌํ๋ค. ์ด metadata๋ฅผ ์ฌ๋ฌ ํ์ด์ง์ ์์ฑํ์ฌ ํ์ด์ง๋ง๋ค ๋ค๋ฅธ metadata๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค.
//์ต์์ layout.tsx
export const metadata = {
title: {
template: '%s | Next Movies',
default: 'Loading...',
},
description: 'The best movies on the best framework',
};
//์ต์์page.tsx
export const metadata = {
title: 'HOME',
};
//aboutํด๋ page.tsx
export const metadata = {
title: 'ABOUT',
};
๊ฐ๊ฐ์ ํ์ผ์ ์
๋ ฅํ metadata๊ฐ ๋ณํฉ๋์ด ํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ ํ์์ ๋ฐ๋ผ ๋ค์ํ metadata๋ฅผ ๋ณด์ฌ์ค์ผํ ๋ ์ ์ฉํ ์ฌ์ฉํ๊ณ head์ ์ง์ ์
๋ ฅํ์ง ์๊ณ ๋ ๊ฒ์์์ง์ต์ ํSEO๊ฐ ๊ฐ๋ฅํ๋ค.
โป'use client'์์๋ ์ฌ์ฉํ ์ ์๋ค!