Next 13์ pages, layouts, templates๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ์๋ก์ด ํ์ผ ์ปจ๋ฒค์ ์ ๋์ ํ๋ค.
Pages
page๋ route์ ์ ์ผํ UI์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ง๋ง ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ค์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฅผ ํจ์นํ ์ ์๋ค.
Layouts
์ฌ๋ฌ pages ๊ฐ์ ๊ณต์ ๋๋ UI์ด๋ค.
- layout์ ์ํ๋ฅผ ๋ณด์กดํ๊ณ , ์ธํฐ๋ํฐ๋ธ๋ฅผ ์ ์งํ๊ณ ์ฌ๋ ๋๋ง์ ํ์ง ์๋๋ค.
- layout.js ํ์ผ์์ default export๋ก ์ ์ํ ์ ์๋ค.
- child ๋ ์ด์์์ด๋ child ํ์ด์ง๊ฐ ์๋ ๊ฒฝ์ฐ์, ํญ์ children props๋ฅผ ์ค์ ํด์ผํ๋ค.
// app/dashboard/layout.tsx
export default function DashboardLayout({
children, // ํ์ด์ง๊ฐ ์๊ฑฐ๋, ์ค์ฒฉ๋ ๋ ์ด์์์ด ์๋ ๊ฒฝ์ฐ
}: {
children: React.ReactNode,
}) {
return (
<section>
{/* ํค๋๋ ์ฌ์ด๋๋ฐ์ฒ๋ผ ๊ณต์ ๋๋ UI๋ฅผ ์ ์ํ ์ ์๋ค. */}
<nav></nav>
{children}
</section>
);
}
- ๋ชจ๋ ํ์ด์ง์ ๊ณต์ ๋๋ ๋ฃจํธ ๋ ์ด์์์ ๋ฐ๋์ html, body ํ๊ทธ๊ฐ ์์ด์ผํ๋ค.
- ๋ ์ด์์์ ๊ธฐ๋ณธ์ ์ผ๋ก children props๋ฅผ ํตํด ์ค์ฒฉ๋๋ค.
- ํน์ route์์ ๊ณต์ ๋๋ ๋ ์ด์์์ ์ ์ธํ๊ณ ์ถ์ ๋์๋ Route Group์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ ์ด์์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ์ด์ง๋ง ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ค์ ํ ์ ์๋ค.
- ๋ ์ด์์์ ๋ฐ์ดํฐ๋ฅผ ํจ์นํ ์ ์๋ค.
- ๋ถ๋ชจ ๋ ์ด์์, ์์ ๋ ์ด์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๋ค. ํ์ง๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ํจ์นํ ์ ์๋ค.
- layout.js์ page.js. ํ์ผ์ ๊ฐ์ ํด๋์ ์ ์ํ ์์๋ค. ๋ ์ด์์์ ํ์ด์ง๋ฅผ ๊ฐ์ผ๋ค.
Root Layout (ํ์)
app ๋๋ ํ ๋ฆฌ์ ๋ฃจํธ ๋ ์ด์์์ ์ ์ํ ์ ์๋ค.
export default function RootLayout({ children }: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
- app ๋๋ ํ ๋ฆฌ๋ ๋ฐ๋์ ๋ฃจํธ ๋ ์ด์์์ ํฌํจํด์ผํ๋ค.
- ๋ฃจํธ ๋ ์ด์์์ ๋ฐ๋์ <html>, <body>๋ฅผ ํฌํจํด์ผํ๋ค.
- head.js ํ์ผ์ ์ฌ์ฉํด์ <head> ์์๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
- route group์ ์ฌ์ฉํด์ ์ฌ๋ฌ๊ฐ์ ๋ฃจํธ ๋ ์ด์์์ ๋ง๋ค ์ ์๋ค.
- ๋ฃจํธ ๋ ์ด์์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ์ด๊ณ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ค์ ํ ์ ์๋ค.
์ค์ฒฉ Layout
๊ธฐ๋ณธ์ ์ผ๋ก layout์ ์ค์ฒฉ๋๋ค.
Template
// app/template.tsx
export default function Template({ children }: {
children: React.ReactNode
}) {
return <div>{children}</div>;
}
Template๋ ์์ layout, page๋ฅผ ๊ฐ์ผ๋ค๋ ์ ์์ layout๊ณผ ๋น์ทํ๋ค.
route์ state๋ฅผ ์ ์งํ๋ layout๊ณผ๋ ๋ค๋ฅด๊ฒ, template๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ ๋ค.
์ฌ์ฉ์๊ฐ template๋ฅผ ๊ณต์ ํ๋ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ ๋, ์ปดํฌ๋ํธ์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋ง์ดํธ๋์ด DOM ์์๊ฐ ๋ค์ ์์ฑ๋๋ค.
์ฆ, Template์์๋ ์ํ๋ ์ ์ง๋์ง ์๊ณ , ๋ชจ๋ effect๋ ๋ค์ ์ฐ๊ฒฐ๋๋ค.
Template vs Layout
์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ template๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ์ ํ๋ค.
- CSS, ์ ๋๋ฉ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ ๋๋ฉ์ด์ ์ ์์ํ๊ฑฐ๋ ์ข ๋ฃํ ๋
- useEffect, useState์ ์์กดํ๋ ๊ธฐ๋ฅ์ธ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ํ๋ ์์ํฌ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
- ์๋ฅผ ๋ค์ด, ๋ ์ด์์ ๋ด๋ถ์ Suspense Boundary๋ ๋ ์ด์์์ด ๋ก๋๋๊ธฐ ์ ์ฒ์์๋ง fallback์ ๋ณด์ฌ์ฃผ๊ณ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ fallback์ ๋ณด์ฌ์ฃผ์ง ์๋๋ค. ์ด ๋, template๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค fallback์ ๋ณด์ฌ์ค ์ ์๋ค.
์์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด Next์์๋ Layout์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
'๐ฉโ๐ค ํ๋ก ํธ์๋ > nextjs' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js][react-query] API Routes ์ฌ์ฉ์ ๋ฌดํ request ๋ฐ์ ์ด์ (0) | 2023.02.09 |
---|---|
[Nextjs] Linking & Navigating (0) | 2023.01.31 |
[NextJS] Routing (0) | 2023.01.31 |