[NextJS] ๋ผ์ฐํ ์์คํ ์ข ๋ฅ - app vs pages ๋๋ ํ ๋ง ๋ฐฉ๋ฒ ๋น๊ต, ํด๋ ๊ตฌ์กฐ ์์, useRouter ์ค๋ฅ ๋๋ฒ๊น
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์ผ๋ก ๋ฐ๊พผ๋ค. ๋!