# Next.js ์‹œ์ž‘ํ•˜๊ธฐ

React ์™„๋ฒฝ ๊ฐ€์ด๋“œ with Redux, Next.js, TypeScript (opens new window)

# Next.js๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Next.js ๋Š” ์ œ์ž‘์„ ์œ„ํ•œ react ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋Œ€๊ทœ๋ชจ react ์•ฑ์„ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅธ๋ฐ” ๋ฆฌ์•กํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

# Next.js ํŠน์ง•

  1. SSR (์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง, Server-side Rendering)์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋‹ค.
  2. ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…

# Next.js ์‹œ์ž‘ํ•˜๊ธฐ

์‚ฌ์ „์ค€๋น„

  • Node.js ์„ค์น˜
npx create-next-app
1

# CNA ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๊ตฌ์กฐ

โ”œโ”€โ”€ pages     # base routing, root: _app.js
โ”œโ”€โ”€ public    # common resource
โ””โ”€โ”€ styles    # style
1
2
3
  • pages
    • ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…
    • root: _app.js
  • public
    • ๊ณต์šฉ ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌ
    • next.js ๋Š” ๋ฆฌ์•กํŠธ์™€ ๋‹ฌ๋ฆฌ index.html์ด ์—†๋Š”๋ฐ, ์ด๋Š” Pre-rendering์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. html์„ ๋งŒ๋“  ํ›„ js๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹
  • styles
    • ์Šคํƒ€์ผ ํŒŒ์ผ์ด ์กด์žฌ

# Routing

# ํŒŒ์ผ๋ช…์— ์˜ํ•œ ๋ผ์šฐํŒ…

pages ํด๋” ๋‚ด ํŒŒ์ผ๋ช…์ด ๋ผ์šฐํŒ…์˜ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ๋ช…์ด home ์ด๋ผ๋ฉด ๋„๋ฉ”์ธ/home ๊นŒ์ง€๊ฐ€ ๋ผ์šฐํŒ… ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

์˜ˆ์™ธ์˜ ๊ฒฝ์šฐ๋กœ ํŒŒ์ผ๋ช…์ด index.js ๋ผ๋ฉด ๋„๋ฉ”์ธ/ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ… ๋œ๋‹ค.

/pages/index.js โ†’ domain.com
/pages/home.js โ†’ domain.com/home

# ์ค‘์ฒฉ ๊ฒฝ๋กœ ๋ผ์šฐํŒ…

์ค‘์ฒฉ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ ํด๋” ์ƒˆ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

/pages/news/index.js โ†’ domain.com/news
/pages/news/item โ†’ domain.com/home/item

# ๋™์  ๋ผ์šฐํŒ…

๋Œ€๊ด„ํ˜ธ([ ]) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ํŽ˜์ด์ง€์ž„์„ ์ธ์ง€ํ•œ๋‹ค.

๋Œ€๊ด„ํ˜ธ ์•ˆ์—๋Š” ์‹๋ณ„์ž๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ์‹๋ณ„์ž๋ช…์€ ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์„ค์ •ํ•œ๋‹ค.

/pages/news/[item].js
โ†’ domain/news/somthing-important
โ†’ domain/news/somthing-else
โ†’ ...

useRouter ํ›…์„ ํ†ตํ•ด ์ฟผ๋ฆฌ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด /pages/news/[item].js ์˜ ๋™์  ๋ผ์šฐํŒ…์ด๋ผ๋ฉด router.query.item ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

// domain.com/news/[item].js
import { useRouter } from 'next/router';

function DetailPage() {
  const router = useRouter();
  console.log(router.query.item);

  return <h1>the detail page.</h1>;
}

export default DetailPage;
1
2
3
4
5
6
7
8
9
10
11

์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด domain.com/news/something-else ๊ฒฝ๋กœ๋กœ ์ด๋™ ์‹œ something-else ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

a ์•ต์ปค ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์— ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฏ€๋กœ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋œ๋‹ค. SPA๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋จ.

Link ๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŒ…์€ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜์ง€ ์•Š๊ณ  ํŽ˜์ด์ง€๋ฅผ ์ด๋™.

๋‹จ, Next.js ์—์„œ์˜ Link ๋Š” ๋ฆฌ์•กํŠธ์™€ ๋‹ฌ๋ฆฌ to ๊ฐ€ ์•„๋‹Œ href ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.

import Link from 'next/link';

function HomePage() {
  return (
    <ul>
      <li>
        <Link href="/">All Meetups</Link>
      </li>
      <li>
        <Link href="/new-meetup">Add New Meetup</Link>
      </li>
    </ul>
  );
}

export default HomePage;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Last Updated: 2022. 6. 5. ์˜คํ›„ 3:42:39