๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฐ Front-end/Next.js

[Next.js] App Router์™€ Page Router์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

by s2ylvia 2024. 6. 12.

 

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