๋‹ด๊ณฐ๋† 2023. 1. 31. 15:47
728x90
๋ฐ˜์‘ํ˜•

Next ๋ผ์šฐํ„ฐ๋Š” ์„œ๋ฒ„ ์ค‘์‹ฌ์˜ ๋ผ์šฐํŒ…๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰๊ฐ์ ์ธ ๋กœ๋”ฉ ์ƒํƒœ์™€ concurrent ๋ Œ๋”๋ง์„ ์ง€์›ํ•œ๋‹ค.

์ฆ‰, ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์žฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ณ , ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ race condition์„ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

<Link> ์ปดํฌ๋„ŒํŠธ

HTML <a> ์š”์†Œ๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์œผ๋กœ prefetching๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค. 

Next์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜์— ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
ํŠน์ • ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด <Link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.
import Link from 'next/link';

export default function Page() {
  return <Link href="/dashboard">Dashboard</Link>;
}

next/link์—์„œ importํ•ด์„œ href๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๋™์ ์œผ๋กœ ๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ธฐ

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

import Link from 'next/link';

export default function PostList({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>
          <Link href={`/blog/${post.slug}`}>
            {post.title}
          </Link>
        </li>
      ))}
    </ul>
  );
}

 

useRouter 

useRouter ํ›…์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ route๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

'use client';

import { useRouter } from 'next/navigation';

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

  return (
    <button type="button" onClick={() => router.push('/dashboard')}>
      Dashboard
    </button>
  );
}

next/navigation์—์„œ importํ•ด์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ›…์„ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

 

useRouter์€ push, refresh ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

Navigation์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

1. <Link> ๋˜๋Š” router.push()๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค

2. ๋ผ์šฐํ„ฐ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ์ฐฝ์— URL์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

3. rotuer๋Š” ํด๋ผ์ด์–ธํŠธ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ segment๋Š” ์žฌ์‚ฌ์šฉํ•œ๋‹ค. 

4. soft navigation์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด, ๋ผ์šฐํ„ฐ๋Š” ์บ์‹œ์—์„œ ์ƒˆ๋กœ์šด segment๋ฅผ ํŒจ์น˜ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ผ์šฐํ„ฐ๋Š” hard navigation์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒจ์น˜ํ•œ๋‹ค.

hard navigation: ์บ์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์•„์„œ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹
soft navigation: ์บ์‹œ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์–ด ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹

soft navigation ์กฐ๊ฑด
1. prefetch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
2. ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
3. ํ˜„์žฌ ๊ฒฝ๋กœ์—์„œ ๋™์ผํ•œ ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

5. ์ƒ์„ฑ๋˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ํŒจ์น˜๋˜๋Š” ๋™์•ˆ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋กœ๋”ฉ UI๋ฅผ ๋ณด์—ฌ์ค€๋‹ค

6. ๋ผ์šฐํ„ฐ๋Š” ์ƒˆ๋กœ์šด segment๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

 

Client-side ์บ์‹ฑ

Client-side ์บ์‹œ๋Š” Next์˜ HTTP ์บ์‹œ์™€๋Š” ๋‹ค๋ฅด๋‹ค.

์ƒˆ๋กœ์šด ๋ผ์šฐํ„ฐ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ client-side ์บ์‹œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

์ฆ‰, ํŠน์ • ๊ฒฝ์šฐ์— ๋ผ์šฐํ„ฐ๋Š” ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

https://beta.nextjs.org/docs/routing/linking-and-navigating#client-side-caching-of-rendered-server-components

 

Routing: Linking and Navigating | Next.js

Learn how to use the Link Component, useRouter Hook, and navigate between routes in your Next.js application.

beta.nextjs.org

 

 

728x90
๋ฐ˜์‘ํ˜•