Linking and Navigating
Next.js์์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์๋ ๋ค ๊ฐ์ง๊ฐ ์์ต๋๋ค:
LinkComponentuseRouterhook (Client Components)redirectfunction (Server Components)- native History API
์ด ํ์ด์ง์์๋ ์ด๋ฌํ ๊ฐ ์ต์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ํ์์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค.
1. <Link> ์ปดํฌ๋ํธ
<Link>๋ HTML <a> ํ๊ทธ๋ฅผ ํ์ฅํ์ฌ ๊ฒฝ๋ก ๊ฐ ํ๋ฆฌํ์นญ ๋ฐ ํด๋ผ์ด์ธํธ ์ธก ํ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ ๊ณต ์ปดํฌ๋ํธ์
๋๋ค.
Next.js์์ ๊ฒฝ๋ก ๊ฐ์ ํ์ํ๋ ๊ธฐ๋ณธ์ ์ด๊ณ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์
๋๋ค.
<Link>๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด next/link๋ฅผ importํ๊ณ , href props๋ฅผ ์ปดํฌ๋ํธ์ ์ ๋ฌํ์ธ์:
1import Link from 'next/link'23export default function Page() {4return <Link href="/dashboard">Dashboard</Link>5}
<Link>์ ์ ๋ฌํ ์ ์๋ ์ ํ์ props๊ฐ ์์ต๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ API ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ์ธ์.
1.1 ์์
1.1.1 ๋์ ์ธ๊ทธ๋จผํธ์ ๋งํฌ ๊ฑธ๊ธฐ
๋์ ์ธ๊ทธ๋จผํธ์ ๋งํฌ๋ฅผ ๊ฑธ ๋, ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด๊ณผ ์ฝ์ ๋ฒ์ ์ฌ์ฉํ์ฌ ๋งํฌ ๋ชฉ๋ก์ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ก๊ทธ ํฌ์คํธ ๋ชฉ๋ก์ ์์ฑํ๋ ค๋ฉด:
1import Link from 'next/link'23export default function PostList({ posts }) {4return (5<ul>6{posts.map(post => (7<li key={post.id}>8<Link href={`/blog/${post.slug}`}>{post.title}</Link>9</li>10))}11</ul>12)13}
1.1.2 ํ์ฑ ๋งํฌ ํ์ธํ๊ธฐ
๋งํฌ๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด usePathname()์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ฌ pathname์ด ๋งํฌ์ href์ ์ผ์นํ๋์ง ํ์ธํ์ฌ ํ์ฑ ๋งํฌ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
1'use client'23import { usePathname } from 'next/navigation'4import Link from 'next/link'56export function Links() {7const pathname = usePathname()89return (10<nav>11<ul>12<li>13<Link className={`link ${pathname === '/' ? 'active' : ''}`} href="/">14Home15</Link>16</li>17<li>18<Link className={`link ${pathname === '/about' ? 'active' : ''}`} href="/about">19About20</Link>21</li>22</ul>23</nav>24)25}
1.1.3 id๋ก ์คํฌ๋กคํ๊ธฐ
Next.js App ๋ผ์ฐํฐ์ ๊ธฐ๋ณธ ๋์์ ์ ๊ฒฝ๋ก์ ์๋จ์ผ๋ก ์คํฌ๋กคํ๊ฑฐ๋ ๋ค๋ก ๋ฐ ์์ผ๋ก ํ์์ ์ํด ์คํฌ๋กค ์์น๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค.
๊ฒฝ๋ก ํ์์์ ํน์ ID๋ก ์คํฌ๋กคํ๋ ค๋ฉด URL์ # ํด์ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ href ํ๋กํผํฐ์ ํด์ ๋งํฌ๋ฅผ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
์ด๋ <Link>๊ฐ <a> ์์๋ก ๋ ๋๋ง๋๋ฏ๋ก ๊ฐ๋ฅํฉ๋๋ค.
1<Link href="/dashboard#settings">Settings</Link>23// Output4<a href="/dashboard#settings">Settings</a>
1.1.4 ์คํฌ๋กค ๋ณต์ ๋นํ์ฑํํ๊ธฐ
Next.js App ๋ผ์ฐํฐ์ ๊ธฐ๋ณธ ๋์์ ์ ๊ฒฝ๋ก์ ์๋จ์ผ๋ก ์คํฌ๋กคํ๊ฑฐ๋ ๋ค๋ก ๋ฐ ์์ผ๋ก ํ์์ ์ํด ์คํฌ๋กค ์์น๋ฅผ ์ ์งํ๋ ๊ฒ์
๋๋ค.
์ด ๋์์ ๋นํ์ฑํํ๋ ค๋ฉด, <Link> ์ปดํฌ๋ํธ์ scroll={false}๋ฅผ ์ ๋ฌํ๊ฑฐ๋,
router.push() ๋๋ router.replace()์ scroll: false๋ฅผ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
1// next/link2<Link href="/dashboard" scroll={false}>3Dashboard4</Link>
1// useRouter2import { useRouter } from 'next/navigation'34const router = useRouter()56router.push('/dashboard', { scroll: false })
2. useRouter() Hook
useRouter hook์ ์ฌ์ฉํ๋ฉด, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
1'use client'23import { useRouter } from 'next/navigation'45export default function Page() {6const router = useRouter()78return (9<button type="button" onClick={() => router.push('/dashboard')}>10Dashboard11</button>12)13}
useRouter์ ๋ ๋ง์ ์ ๋ณด๋ API ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ถ์ฒ:
useRouter๋ฅผ ์ฌ์ฉํ๋ผ๋ ํน๋ณํ ์๊ตฌ์ฌํญ์ด ์๋ ํ, ๋ผ์ฐํธ ๊ฐ์ ์ด๋ํ ๋<Link>์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3. redirect function
์๋ฒ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ, redirect ๊ธฐ๋ฅ์ ๋์ ์ฌ์ฉํ์ธ์.
1import { redirect } from 'next/navigation'23async function fetchTeam(id: string) {4const res = await fetch('https://...')5if (!res.ok) return undefined6return res.json()7}89export default async function Profile({ params }: { params: { id: string } }) {10const team = await fetchTeam(params.id)11if (!team) {12redirect('/login')13}1415// ...16}
์์๋๋ฉด ์ ์ฉ:
redirect๋ ๊ธฐ๋ณธ์ ์ผ๋ก 307(์์ ๋ฆฌ๋๋ ์ ) ์ํ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค.
- ์๋ฒ ์ก์ ์์ ์ฌ์ฉํ๋ฉด 303(๊ธฐํ ์ฐธ์กฐ)์ ๋ฐํํ๋ฉฐ,
- ์ด๋ ์ผ๋ฐ์ ์ผ๋ก POST ์์ฒญ์ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณต ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
redirect๋ ๋ด๋ถ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ฏ๋กtry/catch๋ธ๋ก ์ธ๋ถ์์ ํธ์ถํด์ผ ํฉ๋๋ค.redirect๋ ๋ ๋๋ง ํ๋ก์ธ์ค ์ค ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ํธ์ถํ ์ ์์ง๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ์์๋ ํธ์ถํ ์ ์์ต๋๋ค.
- ๋์
useRouterํ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.redirect๋ ์ ๋ URL๋ ํ์ฉํ๋ฉฐ, ์ธ๋ถ ๋งํฌ๋ก ๋ฆฌ๋๋ ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.- ๋ ๋๋ง ํ๋ก์ธ์ค ์ ์ ๋ฆฌ๋๋ ์ ํ๋ ค๋ฉด,
next.config.js๋๋Middleware๋ฅผ ์ฌ์ฉํ์ธ์.
์์ธํ ๋ด์ฉ์ redirect API ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
4. Using the native History API
Next.js๋ฅผ ์ฌ์ฉํ๋ฉด window.history.pushState ๋ฐ window.history.replaceState ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ ๋ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ก ์คํ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
pushState ๋ฐ replaceState ํธ์ถ์ Next.js ๋ผ์ฐํฐ์ ํตํฉ๋์ด, usePathname ๋ฐ useSearchParams์ ๋๊ธฐํํ ์ ์์ต๋๋ค.
4.1 window.history.pushState
์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ history ์คํ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ด์ state๋ก ๋์๊ฐ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ ๋ชฉ๋ก์ ์ ๋ ฌํ ์ ์์ต๋๋ค:
1'use client'23import { useSearchParams } from 'next/navigation'45export default function SortProducts() {6const searchParams = useSearchParams()78function updateSorting(sortOrder: string) {9const params = new URLSearchParams(searchParams.toString())10params.set('sort', sortOrder)11window.history.pushState(null, '', `?${params.toString()}`)12}1314return (15<>16<button onClick={() => updateSorting('asc')}>Sort Ascending</button>17<button onClick={() => updateSorting('desc')}>Sort Descending</button>18</>19)20}
4.2 window.history.replaceState
๋ธ๋ผ์ฐ์ ์ history ์คํ์์ ํ์ฌ ํญ๋ชฉ์ ๋ฐ๊พธ๋ ค๋ฉด ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์๋ ์ด์ state๋ก ๋์๊ฐ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ locale์ ์ ํํ ๋ ์ฌ์ฉํฉ๋๋ค:
1'use client'23import { usePathname } from 'next/navigation'45export function LocaleSwitcher() {6const pathname = usePathname()78function switchLocale(locale: string) {9// e.g. '/en/about' or '/fr/contact'10const newPath = `/${locale}${pathname}`11window.history.replaceState(null, '', newPath)12}1314return (15<>16<button onClick={() => switchLocale('en')}>English</button>17<button onClick={() => switchLocale('fr')}>French</button>18</>19)20}
5. ๋ด๋น๊ฒ์ด์ ์ ์๋ ๋ฐฉ์
App ๋ผ์ฐํฐ๋ ๋ผ์ฐํ ๊ณผ navigation์ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ์์๋, ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ณ๋ก ์๋์ผ๋ก code-split๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ์์๋ Next.js๊ฐ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ฅผ prefetchesํ๊ณ cachesํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ๋ก๋ก ์ด๋ํ ๋, ๋ธ๋ผ์ฐ์ ๋ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ณ๊ฒฝ๋๋ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ง ๋ค์ ๋ ๋๋งํ์ฌ ํ์ ํ๊ฒฝ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
5.1 ์ฝ๋ ๋ถํ (code splitting)
์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ ์์ ๋ฒ๋ค๋ก ๋ถํ ํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ก๋๋ ๋ฐ์ดํฐ์ ์๊ณผ ๊ฐ ์์ฒญ์ ์คํ ์๊ฐ์ด ์ค์ด๋ค์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ณ๋ก ์๋์ผ๋ก ์ฝ๋ ๋ถํ ํ ์ ์์ต๋๋ค. ์ฆ, ํ์ฌ ๊ฒฝ๋ก์ ํ์ํ ์ฝ๋๋ง ๋ด๋น๊ฒ์ด์ ์ ๋ก๋๋ฉ๋๋ค.
5.2 Prefetching
Prefetching์ ์ฌ์ฉ์๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ฒฝ๋ก๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
Next.js์์ ๊ฒฝ๋ก๋ฅผ ํ๋ฆฌํ์นญํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
-
<Link>component: Routes๋ ์ฌ์ฉ์์ ๋ทฐํฌํธ์ ํ์๋ ๋ ์๋์ผ๋ก Prefetching๋ฉ๋๋ค.- Prefetching์ ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ๋ ๋๋ ์คํฌ๋กค์ ํตํด ๋ทฐํฌํธ์ ํ์๋ ๋ ๋ฐ์ํฉ๋๋ค.
-
router.prefetch():useRouterํ ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<Link>์ ํ๋ฆฌํ์นญ ๋์์ ์ ์ ๊ฒฝ๋ก์ ๋์ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค:
- ์ ์ ๊ฒฝ๋ก(Static Routes):
prefetch๊ธฐ๋ณธ๊ฐ์true์ ๋๋ค. ์ ์ฒด ๊ฒฝ๋ก๊ฐ prefetched๋๊ณ cached๋ฉ๋๋ค. - ๋์ ๊ฒฝ๋ก(Dynamic Routes):
prefetch๊ธฐ๋ณธ๊ฐ์ ์๋์ผ๋ก ์ค์ ํฉ๋๋ค.- ๋ ๋๋ง๋ ์ปดํฌ๋ํธ์ โํธ๋ฆฌโ์์ ์ฒซ ๋ฒ์งธ
loading.jsํ์ผ๊น์ง ๊ณต์ ๋ ์ด์์๋ง ํ๋ฆฌํ์น๋๊ณ 30์ด ๋์ ์บ์๋ฉ๋๋ค. - ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ๋์ ๊ฒฝ๋ก๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐ ๋๋ ๋น์ฉ์ด ์ค์ด๋ค๊ณ ,
- ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ์ฌ ๋ ๋์ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง๋ ์ปดํฌ๋ํธ์ โํธ๋ฆฌโ์์ ์ฒซ ๋ฒ์งธ
ํ๋ฆฌํ์นญ ํ๋กํผํฐ๋ฅผ false๋ก ์ค์ ํ์ฌ prefetch์ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ <Link> API ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
์์๋๋ฉด ์ ์ฉํฉ๋๋ค:
Prefetching์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋ก๋์ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
5.3 Caching
Next.js์๋ ๋ผ์ฐํฐ ์บ์๋ผ๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํด๋ผ์ด์ธํธ ์ธก ์บ์๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ฑ์ ํ์ํ ๋, ๋ฏธ๋ฆฌ ๊ฐ์ ธ์จ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ์ ๋ฐฉ๋ฌธํ ๊ฒฝ๋ก์ React ์๋ฒ ์ปดํฌ๋ํธ ํ์ด๋ก๋๊ฐ ์บ์์ ์ ์ฅ๋ฉ๋๋ค.
์ฆ, ํ์ ์ ์๋ฒ์ ์๋ก ์์ฒญํ๋ ๋์ ์บ์๋ฅผ ์ต๋ํ ์ฌ์ฌ์ฉํฉ๋๋ค.
- ์์ฒญ ๋ฐ ๋ฐ์ดํฐ ์ ์ก ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
์ฆ, ํ์ ์ ์๋ฒ์ ์๋ก์ด ์์ฒญ์ ํ๋ ๋์ ์บ์๋ฅผ ์ต๋ํ ์ฌ์ฌ์ฉํ์ฌ ์์ฒญ๊ณผ ๋ฐ์ดํฐ ์ ์ก ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
๋ผ์ฐํฐ ์บ์์ ์๋ ๋ฐฉ์๊ณผ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
5.4 Partial Rendering
๋ถ๋ถ ๋ ๋๋ง์ ๋ด๋น๊ฒ์ด์ ์์ ๋ณ๊ฒฝ๋ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ง ํด๋ผ์ด์ธํธ์์ ๋ค์ ๋ ๋๋ง๋๊ณ ๊ณต์ ์ธ๊ทธ๋จผํธ๋ ์ ์ง๋๋ค๋ ์๋ฏธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, 2๊ฐ์ ํ์ ๊ฒฝ๋ก์ธ /dashboard/settings์ /dashboard/analytics ์ฌ์ด๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ,
settings ๋ฐ analytics ํ์ด์ง๊ฐ ๋ ๋๋ง๋๊ณ , ๊ณต์ ๋์๋ณด๋ ๋ ์ด์์์ด ์ ์ง๋ฉ๋๋ค.

๋ถ๋ถ ๋ ๋๋ง์ด ์์ผ๋ฉด, ํ์ํ ๋๋ง๋ค ์ ์ฒด ํ์ด์ง๊ฐ ํด๋ผ์ด์ธํธ์์ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ๋ณ๊ฒฝ๋๋ ์ธ๊ทธ๋จผํธ๋ง ๋ ๋๋งํ๋ฉด ์ ์ก๋๋ ๋ฐ์ดํฐ์ ์๊ณผ ์คํ ์๊ฐ์ด ์ค์ด๋ค์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
5.5 Soft Navigation
๋ธ๋ผ์ฐ์ ๋ ํ์ด์ง ์ฌ์ด๋ฅผ ์ด๋ํ ๋ โHard Navigationโ์ ์ํํฉ๋๋ค. Next.js ์ฑ ๋ผ์ฐํฐ๋ ํ์ด์ง ๊ฐ โSoft Navigationโ์ ํ์ฑํํ์ฌ ๋ณ๊ฒฝ๋ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ง ๋ค์ ๋ ๋๋ง๋๋๋ก ํฉ๋๋ค(๋ถ๋ถ ๋ ๋๋ง). ์ด๋ฅผ ํตํด ํ์ ์ค์ ํด๋ผ์ด์ธํธ React ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
5.6 Back and Forward Navigation
๊ธฐ๋ณธ์ ์ผ๋ก Next.js๋ ๋ค๋ก ๋ฐ ์์ผ๋ก ํ์์ ์ํ ์คํฌ๋กค ์์น๋ฅผ ์ ์งํ๊ณ , ๋ผ์ฐํฐ ์บ์์์ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
5.7 page์ app ์ฌ์ด์ ๋ผ์ฐํ
page/์์ app/์ผ๋ก ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ Next.js ๋ผ์ฐํฐ๋ ๋ ํ์ด์ง ์ฌ์ด์ ํ๋ ๋ค๋น๊ฒ์ด์
์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
pages/์์ app/๋ก์ ์ ํ์ ๊ฐ์งํ๊ธฐ ์ํด ์ฑ ๊ฒฝ๋ก์ ํ๋ฅ ์ ๊ฒ์ฌ๋ฅผ ํ์ฉํ๋ ํด๋ผ์ด์ธํธ ๋ผ์ฐํฐ ํํฐ๊ฐ ์๋๋ฐ,
์ด ํํฐ๋ ๋๋๋ก ์คํ์ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ๊ฐ๋ฅ์ฑ์ 0.01%๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฒฝ์ฐ๋ ๋งค์ฐ ๋๋ฌผ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด ๊ฐ๋ฅ์ฑ์ next.config.js์ experimental.clientRouterFilterAllowedRate ์ต์
์ ํตํด ์ฌ์ฉ์ ์ง์ ํ ์ ์์ต๋๋ค.
์คํ๋ฅ ์ ๋ฎ์ถ๋ฉด ํด๋ผ์ด์ธํธ ๋ฒ๋ค์์ ์์ฑ๋๋ ํํฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ค๋ ์ ์ ์ ์ํ์ธ์.
๋๋ ์ด ์ฒ๋ฆฌ๋ฅผ ์์ ํ ๋นํ์ฑํํ๊ณ page/์ app/ ๊ฐ์ ๋ผ์ฐํ
์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด,
next.config.js์์ experimental.clientRouterFilter๋ฅผ false๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ฉด, ์ฑ ๊ฒฝ๋ก์ ๊ฒน์น๋ ํ์ด์ง์ ๋ชจ๋ ๋์ ๊ฒฝ๋ก๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋๋ก ํ์๋์ง ์์ต๋๋ค.