next routing 2๊ฐ€์ง€

์š”๋“ค๋ ˆ์ดํ›„ยท2023๋…„ 9์›” 8์ผ
0

NextJS

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

Summary ๐Ÿงšโ€โ™€๏ธ

๐Ÿ’ก Next๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ pre-rendering(Next.js๊ฐ€ client-side JavaScript๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋ฏธ๋ฆฌ ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ HTML์„ ๋งŒ๋“ค์–ด๋‘๋Š” ๊ฒƒ)์„ ์ง„ํ–‰ํ•ด์„œ CSR๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…์„ ํ•œ๋‹ค(SSG์™€ CSR์„ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ). next์—์„œ๋Š” ๋‘๊ฐ€์ง€ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…์ด ์กด์žฌํ•œ๋‹ค.

1. next/link๋กœ routing

  • lazyํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜์–ด ์ ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ
    (lazy loading์€ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด๋“ค์ด๋Š” ์‹œ์ ์— ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ์„ ์ถ” ํ›„์— ํ•˜๋Š” ๊ธฐ์ˆ )
  • <a>ํƒœ๊ทธ๋กœ ์ž๋™ ๋ณ€ํ™˜
  • SEO ๋ณด์žฅ O

2. next/router๋กœ routing

  • next/link์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ prefetch๊ฐ€ ์•ˆ๋œ๋‹ค.
  • SEO ๋ณด์žฅ X

Concept ๐Ÿง

Pre-rendering, Prefetching

  • pre-rendering : Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŽ˜์ด์ง€๊ฐ€ ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ณผ์ •
    • SSG, SSR
  • pre-fetching : ํŠน์ • ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์•ก์„ธ์Šคํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ๋‹ค.

Pre-rendering์€ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , prefetching์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์— ์•ก์„ธ์Šคํ•  ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜์—ฌ ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

File System Based Routing

  • Next์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” pages ํด๋” ๋‚ด๋ถ€์— ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด, ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ธ์‹ํ•ด ๋ผ์šฐํŒ…๊นŒ์ง€ ํ•ด์ค€๋‹ค.

  • index.js ํŒŒ์ผ์—์„œ ๋งŒ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํŽ˜์ด์ง€๊ฐ€ ์„ค์ •๋œ๋‹ค.
  • index.js ํŒŒ์ผ์ด ์•„๋‹ˆ๋ฉด Nested routes์— ๋‚˜์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๋‹น ํŒŒ์ผ์˜ ์ด๋ฆ„์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ ์„ค์ •๋œ๋‹ค.
  • ๊ฐ ํŒŒ์ผ์—์„œ export default๋กœ ๋‚ด๋ณด๋‚ด์ง€๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

<a>

  • ์ˆœ์ˆ˜ HTML ์š”์†Œ๋กœ, ์‚ฌ์šฉ์ž๋ฅผ ์ƒˆ ํŽ˜์ด์ง€์˜ URL๋กœ ์ด๋™์‹œํ‚ค๋Š” ํ•˜์ดํผ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด๋•Œ ํŽ˜์ด์ง€๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ๊ณ ์นจ ๋œ๋‹ค.
  • ๊ทธ ๊ณผ์ •์—์„œ ํ™”๋ฉด ๊นœ๋นก์ž„์ด ๋ณด์ผ ์ˆ˜ ์žˆ๊ณ  ๋งค๋ฒˆ ํ†ต์‹ ์„ ์ƒˆ๋กญ๊ฒŒ ํ•˜๋‹ค ๋ณด๋‹ˆ ์„ฑ๋Šฅ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ธก๋ฉด์—์„œ ๋–จ์–ด์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ Next์—์„œ๋Š” ํŽ˜์ด์ง€ ์ „ํ™˜์„ ํ•  ๋•Œ Link๋‚˜ Router๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • Link ํƒœ๊ทธ์— href ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ€๊ณ ์ž ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  • Client-side navigation ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋˜๊ณ  navigation๋ณด๋‹ค ๋น ๋ฅด๋ฉฐ SPA์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.
  • ์ตœ์ดˆ ์‹คํ–‰์€ SSG๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ์‹œ CSR ๋ฐฉ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•œ๋‹ค.
  • <a>๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๋ฉฐ <a>๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ์— <Link>์— ์Šคํƒ€์ผ๋ง์„ ๋ฐ”๋กœ ์ž…ํž ์ˆ˜ ์žˆ๋‹ค.

legacyBehavior

  • ๋งํฌ์— legacyBehavior๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด next๋ฒ„์ „ 12์˜ ๋งํฌ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋จ
  • next12์—์„œ๋Š” <Link>๊ฐ€ <a>๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ž์‹์œผ๋กœ aํƒœ๊ทธ๋ฅผ ๋„ฃ์–ด์คฌ์–ด์•ผ ํ–ˆ์Œ

next/router

import {useRouter} from 'next/router';

...

const router = useRouter();
  • router.push
    • ํŽ˜์ด์ง€๊ฐ€ ์ด๋™๋˜๋ฉฐ ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์ด ์Œ“์ธ๋‹ค.
    • Main -> Login -> List์—์„œ ๋งˆ์ดํŽ˜์ด์ง€๋กœ push ํ•˜๋ฉด Main -> Login -> List -> Mypage
  • router.replace
    • ํŽ˜์ด์ง€๊ฐ€ ์ด๋™๋˜๋ฉฐ ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์ด ๊ต์ฒด๋œ๋‹ค.
    • Main -> Login -> List ์—์„œ ๋งˆ์ดํŽ˜์ด์ง€๋กœ replace ํ•˜๋ฉด Main -> Login -> Mypage
  • router.back
    • ๋’ค๋กœ ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์ด๋ฉฐ, "window.history.back()"๊ณผ ๋™์ผํ•˜๋‹ค.
  • router.reload
    • ์ƒˆ๋กœ๊ณ ์นจ ๊ธฐ๋Šฅ์ด๋ฉฐ, "window.location.reload()"์™€ ๋™์ผํ•˜๋‹ค.

Advantages ๐Ÿคฉ

next/link๋กœ routingํ•˜๊ธฐ

  • ๊ธฐ์กด <a>ํƒœ๊ทธ๋กœ ์ด๋™ํ•˜๋ฉด ์ด์ „ ์ ‘์† ํŽ˜์ด์ง€๋ผ๋„ ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜์ง€๋งŒ, next/link๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „์— ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š์Œ

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

  • production build์—์„œ Link๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ๋งˆ๋‹ค, ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ธฐ ์ „์— Next.js๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์—ฐ๊ฒฐ๋œ ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

next/router๋กœ routingํ•˜๊ธฐ

  • ๋กœ์ง์„ ์ฒ˜๋ฆฌ ํ›„ ์›ํ•˜๋Š” ์‹œ์ ์—์„œ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ํ™œ์šฉ๋„๊ฐ€ ๋†’์„ ์ˆ˜ ์žˆ๋‹ค.

Disadvantages ๐Ÿ˜ก

next/router๋กœ routingํ•˜๊ธฐ

  • ํฌ๋กค๋Ÿฌ๊ฐ€ ๋งํฌ๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜์—ฌ SEO๊ฐ€ ์ข‹์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. โ‡’ aํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ
  • next/link์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ”๋กœ js, jsonํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Œ โ‡’ ์ž๋™ prefetchํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    • router.prefetch์— ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” url์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค. โ†’ json๊ณผ js ํŒŒ์ผ์„ prefetchํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • prefetch๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ฃผ์ง€ ์•Š๊ธฐ์— ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด next/link๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

      import Link from 'next/link';
      import { useRouter } from 'next/router';
      import { useEffect } from 'react';
      
      export default function Links() {
        const router = useRouter();
        useEffect(() => {
          router.prefetch('/section1/getStaticProps');
        }, [router]);
      
        return (
          <main>
            <h1>Links</h1>
            <button
              onClick={() => {
                router.push('/section1/getStaticProps');
              }}
            >
              /getStaticProps
            </button>
          </main>
        );
      }

Example Case ๐Ÿ‘

next/link๋กœ routingํ•˜๊ธฐ

import Link from 'next/link';

export default function Links() {

  return (
    <main>
      <h1>Links</h1>
      <Link href='/section1/getStaticProps'>/getStaticProps</Link>
    </main>
  );
}

Next.js์—์„œ๋Š” ์ตœ์ดˆ๋กœ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ HTML์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

ํ˜„์žฌ๋Š” linkํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งํฌํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” HTML ํŒŒ์ผ์„ ๋ฐ›์•„์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋• ์ถ”๊ฐ€์ ์ธ HTML์„ ๋ฐ›์•„์˜ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ํ™•์ธํ•˜๋ฉด getStaticProps ํŽ˜์ด์ง€์— ๊ด€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ ์ตœ์ดˆ ์‹คํ–‰์€ SSG๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ…ํ•  ๋•Œ๋Š” CSR๋ฐฉ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ getStaticPropsํŽ˜์ด์ง€์—์„œ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด getStaticProps์— ํ•ด๋‹นํ•˜๋Š” HTML์„ ๋ฐ›์•„์˜ค๊ณ  ๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ๋„ linksํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  HTML ๋ฌธ์„œ๋Š” ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ SSG์™€ CSR์„ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ next/lnk๋•๋ถ„์ด๋‹ค.

๋น„๊ต๋ฅผ ์œ„ํ•ด ์ผ๋ฐ˜์ ์ธ aํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์ž!

์ด๋ ‡๊ฒŒ a tag๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด ์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ jsonํŒŒ์ผ๋„ ์—†๊ณ  getStaticProps์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋„ ์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งํฌ๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๋ฉด

์•„๊นŒ์™€ ๋‹ฌ๋ฆฌ getStaticProps๋ฅผ ์ƒˆ๋กญ๊ฒŒ HTML๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ CSR์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งค๋ฒˆ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค HTMLํŒŒ์ผ์„ ๋ฐ›์•„์™€์•ผ ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ next/link๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ด๋ฏธ js ํŒŒ์ผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ CSR๋ฐฉ์‹์œผ๋กœ DOM์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ถ”๊ฐ€๋กœ jsonํŒŒ์ผ์„ ๋ณด๋ฉด pageProps๋ผ๋Š” ๊ณณ์— data๊ฐ€ ๋“ค์–ด์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

data์— 0.29๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๋ฐ, getStaticProps ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด,

๊ทธ ํ•ด๋‹น ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๊ณผ json์ด ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐ”๋กœ DOM์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์€ CSR๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

๋•Œ๋ฌธ์— ์ตœ์ดˆ์— ํ•œ ๋ฒˆ๋งŒ HTMLํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  next/link๊ฐ€ ์žˆ๋Š” ๊ณณ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ jsonํŒŒ์ผ๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€์„œ ๋น ๋ฅด๊ฒŒ CSR๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๊นŒ ํ™•์ธํ–ˆ๋“ฏ ํŽ˜์ด์ง€๋งˆ๋‹ค์˜ HTML๋„ ์ด๋ฏธ ํ”„๋ฆฌ๋ Œ๋”๋ง๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SEO๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

next/router๋กœ routingํ•˜๊ธฐ

import { useRouter } from 'next/router'

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

  return (
    <main>
      <h1>Links</h1>
      <button
        onClick={() => {
          router.push('/section1/getStaticProps');
        }}
      >
        /getStaticProps
      </button>
    </main>
  );
}

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด js์™€ jsonํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์ง€๋ฉด์„œ CSR๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…๋œ๋‹ค.

์ด๋ ‡๊ฒŒ useRouter๋Š” next/link๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ next/link์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฒ„ํŠผ์ด ๋ณด์ธ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ js, jsonํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค.

next/link์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ prefetchํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

import Link from 'next/link';
import { useRouter } from 'next/router';
import { useEffect } from 'react';

export default function Links() {
  const router = useRouter();
  useEffect(() => {
    router.prefetch('/section1/getStaticProps');
  }, [router]);

  return (
    <main>
      <h1>Links</h1>
      <button
        onClick={() => {
          router.push('/section1/getStaticProps');
        }}
      >
        /getStaticProp
      </button>
    </main>
  );
}

router.prefetch์— ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” url์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์ด์ œ๋Š” json๊ณผ jsํŒŒ์ผ์„ prefetchํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Wrap-up ๐Ÿช

  • ์ •๋‹ต
    1. link
      • ์ตœ์ดˆ๋กœ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ HTML์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
      • link๊ฐ€ ๋ณด์ด๋ฉด ๋ฐ”๋กœ js, json ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
      • ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ HTML์„ ๋ฐ›์•„์˜ค์ง€ ์•Š๊ณ  ์ด๋™ํ•  ํŽ˜์ด์ง€์— ๊ด€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
      • ์ฆ‰ ์ตœ์ดˆ ์‹คํ–‰์€ SSG๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ…ํ•  ๋•Œ๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    2. router
      • ํŽ˜์ด์ง€ ์ด๋™ํ•  ๋•Œ js์™€ json ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์ง€๋ฉด์„œ CSR ๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…๋œ๋‹ค.
      • ํ•˜์ง€๋งŒ next/link์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฒ„ํŠผ์ด ๋ณด์ธ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ js, json ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์ง„ ์•Š๋Š”๋‹ค.
  • ์ •๋‹ต SPA์ฒ˜๋Ÿผ ํŽ˜์ด์ง€๊ฐ„ ์ด๋™์‹œ์— ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ(CSR)์—์„œ ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ ํ•ด์คŒ
  • ์ •๋‹ต
    1. link
      • <a>ํƒœ๊ทธ๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์›น์‚ฌ์ดํŠธ๊ฐ€ ํฌ๋กค๋ง ๋˜์–ด SEO์— ์œ ๋ฆฌํ•˜๋‹ค.
      • lazy ํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฐฉ์ง€
    2. router
      • <a>ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”๋ฅผ ์‹ ๊ฒฝ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋งํฌ๋Š” ํฌ๋กค๋ง๋˜์ง€ ์•Š์Œ
      • next/link์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ prefetch๊ฐ€ ์•ˆ๋œ๋‹ค.
      • ๋ผ์šฐํŒ…์„ ํ•˜๊ธฐ ์ „ ๋กœ์ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ, ๋Œ€๋ถ€๋ถ„ onClick๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๊ฐ™์ด ์‚ฌ์šฉ
profile
์„ฑ๊ณต = ๋ฌดํ•œ๋„์ „ + ๋ฌดํ•œ์‹คํŒจ

0๊ฐœ์˜ ๋Œ“๊ธ€