๐ŸŽฎ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/๐Ÿ‘ฉ‍๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€

[NextJS] ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ ์ข…๋ฅ˜ - app vs pages ๋””๋ ‰ํ† ๋ง ๋ฐฉ๋ฒ• ๋น„๊ต, ํด๋” ๊ตฌ์กฐ ์˜ˆ์‹œ, useRouter ์˜ค๋ฅ˜ ๋””๋ฒ„๊น…

xxilliant 2025. 4. 25. 23:01
728x90
๋ฐ˜์‘ํ˜•

Next.js์—์„œ app ๋””๋ ‰ํ† ๋ฆฌ์™€ pages ๋””๋ ‰ํ† ๋ฆฌ๋Š”

๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


1. pages ๋””๋ ‰ํ† ๋ฆฌ

import { useRouter } from 'next/router'; ์‚ฌ์šฉ

/pages ๊ตฌ์กฐ ์˜ˆ์‹œ
  index.tsx                  → /
  about.tsx                  → /about

  # ๐Ÿ‘ค ์‚ฌ์šฉ์ž์šฉ
  client/
    dashboard.tsx            → /client/dashboard
    profile.tsx              → /client/profile
    blog/
    	[id].tsx            → /client/blog/:id

  # ๐Ÿ›  ๊ด€๋ฆฌ์ž์šฉ
  admin/
    index.tsx                → /admin
    users.tsx                → /admin/users
    blog/
      index.tsx              → /admin/blog
      [id].tsx               → /admin/blog/:id

  _app.tsx                   → ์ „์ฒด ๋ ˆ์ด์•„์›ƒ
  _document.tsx              → ๋ฌธ์„œ ๊ตฌ์กฐ

 

ํŠน์ง•:

  • ๋ผ์šฐํŒ…์€ ํŒŒ์ผ ์ด๋ฆ„ ๊ธฐ๋ฐ˜
  • ๋ชจ๋“  ํŽ˜์ด์ง€๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ
  • Next.js ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” React Router ์—†์ด ๋™์ž‘

์žฅ์ :

  • URL ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋จ
  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ : ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŒ…์ด ์ž๋™์œผ๋กœ ์„ค์ •๋˜์–ด, ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๊ณ  ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•จ
  • ๋™์  ๋ผ์šฐํŒ…๊ณผ API๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

2. app ๋””๋ ‰ํ† ๋ฆฌ (์•ฑ ๋ผ์šฐํŒ…)

import { useRouter } from 'next/navigation'; ์‚ฌ์šฉ

'use client'; ์„ ์–ธ ํ•„์š”

/app ๊ตฌ์กฐ ์˜ˆ์‹œ
  layout.tsx                 → ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ (๋ชจ๋‘์— ์ ์šฉ ๊ฐ€๋Šฅ)
  page.tsx                   → /
  about/
  	page.tsx             → /about

  # ๐Ÿ‘ค ์‚ฌ์šฉ์ž์šฉ
  client/
    layout.tsx               → /client ์ „์šฉ ๋ ˆ์ด์•„์›ƒ
    dashboard/
    	page.tsx       → /client/dashboard
    profile/
    	page.tsx         → /client/profile
    blog/
    	[id]/
        	page.tsx       → /client/blog/:id

  # ๐Ÿ›  ๊ด€๋ฆฌ์ž์šฉ
  admin/
    layout.tsx               → /admin ์ „์šฉ ๋ ˆ์ด์•„์›ƒ
    page.tsx                 → /admin
    users/
    	page.tsx           → /admin/users
    blog/
      page.tsx               → /admin/blog
      [id]/
      	page.tsx          → /admin/blog/:id

  not-found.tsx              → 404 ์ฒ˜๋ฆฌ

 

ํŠน์ง•:

  • ํด๋” ๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ์ค‘์ฒฉ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ
  • page.tsx = ์‹ค์ œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ
  • layout.tsx = ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ (์ „์—ญ/์„น์…˜๋ณ„ ๊ฐ€๋Šฅ)
  • loading.tsx, error.tsx = ์ƒํƒœ๋ณ„ ํ™”๋ฉด ๋ถ„๊ธฐ ์ง€์›

์žฅ์ :

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ, ๋” ์„ธ๋ฐ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅ
  • ๊ฐ ์˜์—ญ์ด ์ž์ฒด์ ์ธ ์ปดํฌ๋„ŒํŠธ/์Šคํƒ€์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์ฒ˜๋Ÿผ ์„ค๊ณ„ ๊ฐ€๋Šฅ
  • ๋ฆฌ์•กํŠธ 18์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ๋”์šฑ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ ˆ์ด์•„์›ƒ๊ณผ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ, ํŽ˜์ด์ง€ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ UI๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋” ๋‚˜์€ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ: ๋กœ๋”ฉ๊ณผ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ ํŽ˜์ด์ง€ ์ˆ˜์ค€์—์„œ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋”์šฑ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ

3. ๋น„๊ต:

  • pages ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ธฐ์กด ๋ฐฉ์‹์˜ Next.js ํ”„๋กœ์ ํŠธ์—์„œ, ๊ฐ„๋‹จํ•œ ๋ผ์šฐํŒ…๊ณผ API ๋ผ์šฐํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐ„๋‹จํ•œ ์‚ฌ์ดํŠธ๋‚˜ ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • app ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋” ๋ณต์žกํ•œ ์•ฑ์—์„œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์ข‹์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋งˆ๋‹ค ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด app ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pages๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ฒ˜์Œ๋ถ€ํ„ฐ app ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก 

  • ๊ฐ„๋‹จํžˆ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด pages ๋ฐฉ์‹
  • ๊ธฐํš์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด app ๋ฐฉ์‹

๐Ÿ‘‰ Next.js ํŒ€์€ ์•ž์œผ๋กœ app ๋ฐฉ์‹(App Router)์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ผ๊ณ  ์—…๋ฐ์ดํŠธํ•  ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์—,
     ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” app ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

 


๋ผ์šฐํŒ… ๊ด€๋ จ ์˜ค๋ฅ˜ : 

Error: × You have a Server Component that imports next/router. Use next/navigation instead. โ”‚ Learn more: https://nextjs.org/docs/app/api-reference/functions/use-router โ•ญโ”€[/Users/suhyun/Desktop/kiosk/kiosk_fe/src/app/page.tsx:2:1] 1 โ”‚ import style from "./page.module.css"; 2 โ”‚ import { useRouter } from "next/router"; ·

 

์›์ธ :

Next.js 13์—์„œ๋Š” app ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” App Router์™€ pages ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Pages Router๊ฐ€ ์žˆ๋Š”๋ฐ, app ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ๋Š” "next/navigation"์˜ useRouter๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ. ์ด๋Š” Next.js์—์„œ Server Components์™€ Client Components์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ํ•จ

pages ๋ฐฉ์‹์—์„œ์˜ ๋ผ์šฐํŒ…์€ ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ(Client-Side Rendering)์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ผ์šฐํ„ฐ ๊ธฐ๋Šฅ์„ ์ž์œ ๋กญ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์–ด.

ํ•˜์ง€๋งŒ Next.js 13์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Component) ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์–ด. ์ด๊ฑด ๋ง ๊ทธ๋Œ€๋กœ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ๋จผ์ € ์‹คํ–‰ํ•ด์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ด๋•Œ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ(์˜ˆ: ๋ผ์šฐํ„ฐ ์กฐ์ž‘)์„ ์ง์ ‘ ์“ธ ์ˆ˜ ์—†์–ด.

๊ทธ๋ž˜์„œ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๊ธฐ๋Šฅ(์˜ˆ: useRouter)์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ”๋กœ ์“ฐ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, Next.js๊ฐ€ ๊ตฌ๋ถ„๋œ ์ „์šฉ ๋ชจ๋“ˆ(next/navigation)์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ์•ผ.

-chatGPT

 

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :

next/router๋ฅผ next/navigation์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ๋!

728x90
๋ฐ˜์‘ํ˜•