Next.js์ Router (Page Router)
๊ธฐ์กด Next.js๋ ํ์ด์ง ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ค.
/page ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ด ์ถ๊ฐ๋๋ฉด ๋ผ์ฐํ ์ค์ ํ์์์ด ์๋์ผ๋ก ๊ฒฝ๋ก๋ก ์ฌ์ฉํ ์ ์์๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ Next.js๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ผ์ฐํ ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
pages/index.js → /
pages/blog/index.js → /blog
์์ ๊ฐ์ด /page ๋๋ ํฐ๋ฆฌ ์์ ๋๋ ํฐ๋ฆฌ๋ ํ์ผ์ ์์ฑํ๋ฉด ์๋์ผ๋ก ๋ผ์ฐํ ์ด ๊ฐ๋ฅํ๋ค.
App Router
ํ์ง๋ง Next.js 13๋ถํฐ App Router๊ฐ ์๋ก ๋์ ๋์๋ค.
App Router๋ ๊ณต์ ๋ ์ด์์, ์ค์ฒฉ ๋ผ์ฐํ , ๋ก๋ฉ ์ํ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ ์ง์ํ๋ React Sever Component๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ๋ผ์ฐํฐ์ด๋ค.
Page
ํ์ด์ง๋ ๊ฒฝ๋ก์ ๊ณ ์ ํ UI์ด๋ค.
// `app/dashboard/page.tsx` is the UI for the `/dashboard` URL
export default function Page() {
return <h1>Hello, Dashboard Page!</h1>
}
/dashboard๋ก ๋ผ์ฐํ ํ๊ธฐ์ํด์
์ด์ /app ๋๋ ํฐ๋ฆฌ ์์ /dashboard ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ณ page.js(tsx) ํ์ผ์ ์์ฑํ๋ฉด ๋๋ค.
Layout
๋ ์ด์์์ ์ฌ๋ฌ ํ์ด์ง ๊ฐ์ UI๋ฅผ ๊ณต์ ํ๋ค.
์ํ๋ฅผ ์ ์งํ๊ณ ํด๋น ํด๋ ๋ด์์ ํ์ํ ๋ ๋ค์ ๋ ๋๋ง๋์ง ์๋ ์ฅ์ ์ด ์๋ค.
๋ง์น ์ ์ญ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ ๊ฒ๊ณผ ๊ฐ์ด, ๋๋ ํฐ๋ฆฌ ๋ด์์์ ๋ชจ๋ ํ์ด์ง์ ๊ณต์ ๋๋ค.
export default function DashboardLayout({
children, // will be a page or nested layout
}: {
children: React.ReactNode
}) {
return (
<section>
{/* Include shared UI here e.g. a header or sidebar */}
<nav></nav>
{children}
</section>
)
}
Server Component
์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ์คํ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๊ธฐ ์ ์ ์๋ฒ์์ HTML๋ก ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์ด๋ค.
์ด๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์์ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ๋ถ๋ด์ ์ค์ฌ์ฃผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
์๋ํ๋ฉด ์๋ฒ ์ปดํฌ๋ํธ๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์ ํ์ํ ์ต์ํ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ ํด๋ผ์ด์ธํธ์ ์ ์กํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ก ์ธํด ๋คํธ์ํฌ ์ฌ์ฉ๋์ด ๊ฐ์ํ๊ณ , ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
๊ทธ๋์ app directory ๋ด๋ถ์์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๋ก ๋์๋๋ค.
Data Fetching
async function getData() {
const res = await fetch('https://api.example.com/...');
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
return res.json();
}
// This is an async Server Component
export default async function Page() {
const data = await getData();
return <main>{/* ... */}</main>;
}
RSC(React Server Component) ์ง์์ผ๋ก Page Router์ getServersideProps, getStaticProps๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ปดํฌ๋ํธ์์ ๋ฐ๋ก fetch API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์นญํ ์ ์๊ฒ ๋์๋ค.
๋ํ http ์์ฒญ์ ๊ณ์ ์ ์งํ๋ฉด์ chunk ๋จ์๋ก ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ์ ์กํ๋ ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ค.
๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ์ด ์๋ฃ๋ ๋ถ๋ถ์ ๋จผ์ ํ์ํจ์ผ๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์๋ค.
๊ฒฐ๋ก
๋ฐ๋ผ์ App Router๋ ํ์ด์ง ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ Page Router์ ๋ฌ๋ฆฌ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ผ์ฐํฐ ๋ฐฉ์์ผ๋ก, Page Router๋ณด๋ค ๋ณต์ก์ฑ์ด ๋์ง๋ง ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ ๋ฉด์์ ํจ์ฌ ํฅ์๋ ๋ผ์ฐํฐ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์๊ฒ ๋ค.
page ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ app ๋๋ ํฐ๋ฆฌ์ ๋๋ ํฐ๋ฆฌ๋ ํ์ผ์ ์์ฑํ๋ฉด ์๋์ผ๋ก ๋ผ์ฐํ ์ด ๋๊ณ ,
layout๊ณผ ๊ฐ์ ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํด ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง๋ณด์์ฑ์ ๋์ธ๋ค.
๋ํ ์ปดํฌ๋ํธ ๋ด์์ fetch API๋ฅผ ์ฌ์ฉํด ๋์ฑ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์นญํ ์ ์๊ณ ์คํธ๋ฆฌ๋ฐ์ ์ง์ํด ์ฌ์ฉ์ ๊ฒฝํ ์ญ์ ํฅ์์ํจ๋ค.
์ฐธ๊ณ
https://nextjs.org/docs/app/building-your-application/routing
Building Your Application: Routing | Next.js
Learn the fundamentals of routing for front-end applications.
nextjs.org
https://www.jadru.com/diffrent-approuter-and-pagerouter#3b8682f35aa049058a215c6cb8b28db9
Next.js 13๋ถํฐ์ App Router์ ๊ธฐ์กด Page Router์ ์ฐจ์ด ๋น๊ต
์๋ก ๋ฐ๋ ๋ณต์กํ App Router์ ๋ํด ์์๋ณด์!
www.jadru.com
https://f-lab.kr/insight/understanding-nextjs-and-server-components
Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์ ์ดํด์ ํ์ฉ
Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฐ๋ , ์ฅ์ ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
f-lab.kr
https://github.com/jaden2dev/wanted-pre-onboarding-challenge-react/issues/69
2024.05.30 - ์ด์ํฌ · Issue #69 · jaden2dev/wanted-pre-onboarding-challenge-react
1. JavaScript ES6+ ๊ธฐ๋ฅ ๋ฌธ์ : JavaScript ES6 ์ดํ์ ์ถ๊ฐ๋ ์ฃผ์ ๊ธฐ๋ฅ ์ค์์, ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด, ํ์ดํ ํจ์, ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ค๋ช ํ๊ณ , ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ด JavaScript ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋
github.com
'๐ฐ Front-end > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js] Server Component์ Client Component์ ๋ํด ์์๋ณด์ (0) | 2024.06.12 |
---|---|
[Next.js] Next.js๋ฅผ ์ค์นํ๊ณ ์คํํด ๋ณด์! (0) | 2024.04.16 |