Syw.Frontend

๐Ÿ“˜ Next.js ๊ธฐ์ดˆ ๊ฐ•์ขŒ

1๋‹จ๊ณ„. Next.js ์ž…๋ฌธ (๊ฐœ๋… & ํ™œ์šฉ ๊ธฐ์ดˆ)

1-2. ํŽ˜์ด์ง€์™€ ๋ผ์šฐํŒ…

1. Next.js ๋ผ์šฐํŒ… ๊ธฐ๋ณธ ๊ฐœ๋…

  • Next.js๋Š” ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, app/ ํด๋” ์•ˆ์— ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ URL ๊ฒฝ๋กœ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

app/page.tsx        โ†’   /
app/about/page.tsx  โ†’   /about
app/contact/page.tsx โ†’  /contact

๐Ÿ‘‰ ๋ณ„๋„์˜ ๋ผ์šฐํ„ฐ ์„ค์ • ์—†์ด ํด๋”/ํŒŒ์ผ ๊ตฌ์กฐ = ๋ผ์šฐํŒ… ์ด๋ผ๋Š” ์ ์ด Next.js์˜ ํฐ ์žฅ์ ์ด์—์š”.


2. About ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

(1) app/about/page.tsx ์ƒ์„ฑ

export default function AboutPage() {
  return (
    <main>
      <h1>About ํŽ˜์ด์ง€</h1>
      <p>์ด ํŽ˜์ด์ง€๋Š” Next.js ๋ผ์šฐํŒ…์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.</p>
    </main>
  );
}

โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000/about ์ ‘์†ํ•˜๋ฉด About ํŽ˜์ด์ง€๊ฐ€ ์ž๋™์œผ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค ๐ŸŽ‰


3. ํŽ˜์ด์ง€ ์ด๋™ (Link ์ปดํฌ๋„ŒํŠธ)

Next.js์—์„œ๋Š” Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๊ฐ„ ์ด๋™์„ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ์ ์šฉ๋˜์–ด ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•ด์š”.

(1) app/page.tsx ์ˆ˜์ •

import Link from "next/link";
import styles from "@/styles/home.module.scss";

export default function Home() {
  return (
    <main>
      <h1 className={styles.title}>Hello Next.js ๐Ÿš€</h1>
      <p className={styles.description}>
        ์ด๊ฒƒ์ด ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ Next.js ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
      </p>
      <Link href="/about">๐Ÿ‘‰ About ํŽ˜์ด์ง€๋กœ ์ด๋™</Link>
    </main>
  );
}

๐Ÿ‘‰ ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ๐Ÿ‘‰ About ํŽ˜์ด์ง€๋กœ ์ด๋™ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด /about์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.


4. ๊ธ€๋กœ๋ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งŒ๋“ค๊ธฐ

์ž์ฃผ ์“ฐ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜์€ layout.tsx์—์„œ ๊ณตํ†ต์œผ๋กœ ๋„ฃ์–ด๋‘๋Š” ๊ฒŒ ์ข‹์•„์š”.

(1) app/layout.tsx ์ˆ˜์ •

import { Noto_Sans_KR } from 'next/font/google';
import Link from 'next/link';
import './globals.css';

const notoSansKR = Noto_Sans_KR({
  subsets: ['latin'],
  weight: ['400', '500', '700'],
});

export const metadata = {
  title: 'My Next.js App',
  description: 'Next.js ๊ธฐ์ดˆ ๊ฐ•์ขŒ ํ”„๋กœ์ ํŠธ',
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="ko">
      <body className={notoSansKR.className}>
        <header style={{ padding: '1rem', borderBottom: '1px solid #ddd' }}>
          <nav style={{ display: 'flex', gap: '1rem' }}>
            <Link href="/">ํ™ˆ</Link>
            <Link href="/about">์†Œ๊ฐœ</Link>
          </nav>
        </header>
        <main style={{ padding: '2rem' }}>{children}</main>
      </body>
    </html>
  );
}

๐Ÿ‘‰ ์ด์ œ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์ƒ๋‹จ์— ํ™ˆ | ์†Œ๊ฐœ ๋ฉ”๋‰ด๊ฐ€ ๋ณด์ด๊ณ , ํด๋ฆญ ์‹œ ์ด๋™๋ฉ๋‹ˆ๋‹ค.


5. ์˜ค๋Š˜์˜ ์ •๋ฆฌ

  • ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์ดํ•ด (app/about/page.tsx โ†’ /about)
  • Link ์ปดํฌ๋„ŒํŠธ๋กœ ํŽ˜์ด์ง€ ์ด๋™
  • layout.tsx๋ฅผ ํ™œ์šฉํ•ด ๊ธ€๋กœ๋ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งŒ๋“ค๊ธฐ

๐Ÿ“š ์ €์žฅ์†Œ

GitHub - heroyooi/next-tutorial at ch1_2

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.