Next.js 15์—์„œ๋Š” App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ƒˆ๋กœ์šด Navigation Hook๋“ค์ด ์žˆ๋‹ค. ์ด Hook๋“ค์€ React ์•ฑ์˜ ๋ผ์šฐํŒ…์„ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ณ , ์ง๊ด€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ํŠนํžˆ useRouter, usePathname, useSearchParams์™€ ๊ฐ™์€ Hook๋“ค์€ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์†์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.


useRouter โ€“ ๋ผ์šฐํŒ… ๊ด€๋ จ ์ •๋ณด์™€ ํ•จ์ˆ˜ ์ œ๊ณต

useRouter๋Š” ํ˜„์žฌ ๋ผ์šฐํ„ฐ์™€ ๊ด€๋ จ๋œ ์ •๋ณด์™€ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. ํŽ˜์ด์ง€ ์ด๋™์ด๋‚˜ ๋ผ์šฐํŒ… ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. App Router์—์„œ๋Š” useRouter๋กœ router.push, router.replace ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ˜„์žฌ URL ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

import { useRouter } from 'next/navigation';

export default function MyPage() {
  const router = useRouter();
  
  const handleClick = () => {
    router.push('/next-page');
  };
  
  return (
    <div>
      <button onClick={handleClick}>Go to Next Page</button>
    </div>
  );
}

useRouter๋Š” ํŽ˜์ด์ง€ ์ด๋™์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. ๋˜ํ•œ, ํŽ˜์ด์ง€์˜ query๋‚˜ path, search params ๋“ฑ๋„ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.


usePathname โ€“ ํ˜„์žฌ ๊ฒฝ๋กœ ์–ป๊ธฐ

usePathname์€ ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์œ ์šฉํ•œ Hook์ด๋‹ค. ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

import { usePathname } from 'next/navigation';

export default function Navigation() {
  const pathname = usePathname();
  
  return (
    <div>
      <h1>ํ˜„์žฌ ๊ฒฝ๋กœ: {pathname}</h1>
    </div>
  );
}

useSearchParams โ€“ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ด€๋ฆฌ

useSearchParams๋Š” ํ˜„์žฌ URL์—์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ์— ๋งž๊ฒŒ URL์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

import { useSearchParams } from 'next/navigation';

export default function SearchPage() {
  const searchParams = useSearchParams();
  const searchQuery = searchParams.get('query');

  return (
    <div>
      <h1>๊ฒ€์ƒ‰์–ด: {searchQuery}</h1>
    </div>
  );
}

useSearchParams๋Š” URL์— ์žˆ๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ์ฝ์–ด์™€์„œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋Ÿผ Page Router์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜?

Page Router์—์„œ๋Š” next/navigation ๋Œ€์‹  next/router ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. next/navigation์˜ useRouter ๋Š” App Router์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Page Router์—์„œ๋Š” next/router ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œํ‚ค๊ณ , ๊ฒฝ๋กœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. next/router๋Š” router.push, router.replace, router.query ๋“ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํŽ˜์ด์ง€์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๊ฒฝ๋กœ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

import { useRouter } from 'next/router';

export default function MyPage() {
  const router = useRouter();

  // ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ด
  const currentPath = router.pathname;

  // ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
  const query = router.query;

  // ๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด
  const { id } = router.query;

  const handleClick = () => {
    router.push('/next-page');
  };

  return (
    <div>
      <p>ํ˜„์žฌ ๊ฒฝ๋กœ: {currentPath}</p>
      <p>์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ: {JSON.stringify(query)}</p>
      <button onClick={handleClick}>Go to Next Page</button>
    </div>
  );
}

์ •๋ฆฌ

Hook์–ธ์ œ ์“ฐ๋‚˜ํŠน์ง•
useRouterApp Router์—์„œ ํŽ˜์ด์ง€ ์ด๋™, ๋ผ์šฐํŒ… ์ƒํƒœ ๊ด€๋ฆฌ ์‹œํŽ˜์ด์ง€ ์ด๋™๊ณผ ๋ผ์šฐํŒ… ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ๊ณต
usePathnameํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜
useSearchParams์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ๋•ŒURL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ด€๋ฆฌ
next/routerPage Router์—์„œ ๋ผ์šฐํŒ… ๊ด€๋ จ ์ž‘์—… ์‹œํŽ˜์ด์ง€ ์ด๋™, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, ๊ฒฝ๋กœ ์ •๋ณด ์ œ๊ณต

๋‹ค์Œ ํŒŒํŠธ์—์„œ๋Š”

useSelectedLayoutSegment, useFormState, useFormStatus์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด App Router ๊ด€๋ จ ํ›…์„ ์‚ดํŽด๋ณด๋ฉฐ, ๊ทธ ์‚ฌ์šฉ๋ฒ•๊ณผ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค. React์™€ Next.js์˜ ์ตœ์‹  ๊ธฐ๋Šฅ๋“ค์„ ์‹ค๋ฌด์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๊ณ , ๊ฐ ํ›…๋“ค์˜ ํŠน์„ฑ์„ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.