๐Ÿš€Next

Nextjs

  • nextjs๋Š” React ํ”„๋ ˆ์ž„์›Œํฌ

  • https://nextjs.org/blog/next-13

0.์šฉ์–ด ์„ค๋ช…

0.1.์ปดํŒŒ์ผ(compiling)

  • JSX, TS, JS ๋“ฑ์„ ๋ชจ๋‘ -> ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜๋„๋ก Javascript๋กœ ๋ณ€ํ™˜

0.2.์ถ•์†Œ(minifying)

  • ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์€ ๊ฑด๋“ค์ด์ง€ ์•Š์œผ๋ฉด์„œ ์ฃผ์„, ๊ณต๋ฐฑ, ๋“ค์—ฌ์“ฐ๊ธฐ, ๋ณ€์ˆ˜ ๋“ฑ์„ ์ค„์—ฌ ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™”

  • ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ํ†ตํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ

0.3.๋ฒˆ๋“ค๋ง(bundling)

  • ์—ฌ๋Ÿฌ ๋‚ด๋ถ€ ๋ชจ๋“ˆ๊ณผ ์™ธ๋ถ€ ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ณต์žกํ•œ ์ข…์†์„ฑ์—์„œ ์‚ฌ์šฉ์ž์˜ ํŒŒ์ผ ์š”์ฒญ์„ ์ค„์ด๊ณ  ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต

0.4.์ฝ”๋“œ๋ถ„ํ• (code-splitting)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค์„ ๊ฐ ์ง„์ž…์ (ํŽ˜์ด์ง€)์— ํ•„์š”ํ•œ ๋” ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ถ„ํ• 

  • ๊ฐ๊ฐ์˜ ํŽ˜์ด์ง€๋Š” ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ๋กœ๋“œํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•

0.5.์‚ฌ์ „๋ Œ๋”๋ง(Pre-Rendering)

  • ์ผ๋ฐ˜์ ์ธ React ์•ฑ์€ javascript๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์•„ ์•ฑ์„ ๋ณผ ์ˆ˜ ์—†๋‹ค.

  • ์‚ฌ์ „๋ Œ๋”๋ง์—์„œ javascript๋Š” ์•ฑ์„ ๋Œ€ํ™”ํ˜•์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

Server-Side Rendering (์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)

  • ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก ์ „์— ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ , react ์š”์†Œ๋ฅผ html๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑ.

  • https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props

Static Site Generation(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ(๋ฐฐํฌ) ์‹œ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ

  • HTML์€ CDN์— ์ €์žฅ๋˜์–ด ๊ฐ ์š”์ฒญ ์‹œ ์žฌ์‚ฌ์šฉ

  • https://nextjs.org/docs/basic-features/data-fetching/get-static-props

์„œ๋ฒ„์‚ฌ์ด๋“œ vs ์ •์  ์ƒ์„ฑ

  • ์ •์  ์ƒ์„ฑ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€, ์„ค๋ช…์„œ ๋“ฑ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์š”์ฒญ๊ณผ ๊ด€๋ จ์—†์ด ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

  • ์„œ๋ฒ„์‚ฌ์ด๋“œ: ํŽ˜์ด์ง€์— ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(ํ•ญ์ƒ ์ตœ์‹ )

0.6.ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง(Client-Side Rendering)

  • React๋Š” ์„œ๋ฒ„์—์„œ ๋นˆ HTML๊ณผ Javascript๋ฅผ ๋ฐ›๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ Javascript๋กœ ๊ทธ๋ฆฐ๋‹ค.

1. ์‹œ์ž‘ํ•˜๊ธฐ

1. app ๋””๋ ‰ํ† ๋ฆฌ ๋ผ์šฐํŒ…

https://beta.nextjs.org/docs/routing/fundamentals

  • <a> ๋Œ€์‹ ์— ์‚ฌ์šฉ.

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ํƒ์ƒ‰์œผ๋กœ ๊ธฐ๋ณธ ํƒ์ƒ‰๋ณด๋‹ค ๋” ๋น ๋ฆ„

import Link from 'next/link';
<Link href="/">Back to home</Link>

3. Image

  • /public/images ๋””๋ ‰ํ† ๋ฆฌ์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ

import Image from 'next/image';
 <Image
    src="/images/profile.jpg" // Route of the image file
    height={144} // Desired size with correct aspect ratio
    width={144} // Desired size with correct aspect ratio
    alt="Your Name"
  />

4. Metadata

  • head๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

// Static metadata
export const metadata = {
  title: '...',
};

// Dynamic metadata
export async function generateMetadata({ params, searchParams }) {
  const product = await getProduct(params.id);
  return { title: product.title };
}

https://beta.nextjs.org/docs/api-reference/metadata

5. Script

  • ์„œ๋“œํŒŒํ‹ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  • strategy: ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์‹œ๊ธฐ ์ง€์ •

  • onLoad: ๋กœ๋“œ ์งํ›„ ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

"use client";
import Script from "next/script";
export default function FirstPost() {
  return (
    <>
      <Script
        src="https://connect.facebook.net/en_US/sdk.js"
        strategy="lazyOnload"
        onLoad={() =>
          console.log(`script loaded correctly, window.FB has been populated`)
        }
      />
    </>
  );
}

6. layout-component

  • ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” UI

  • page.js์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์— layout.js๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ์ ์šฉ

import styles from './layout.module.css';

export default function Layout({ children }) {
  return <div className={styles.container}>{children}</div>;
}
<Layout>
    <component></component>
</Layout>

๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ(ํ•„์ˆ˜)

  • /app/layout.js์—์„œ ์ž‘์„ฑ

  • <html><body>๋ฅผ ํฌํ•จํ•˜์—ฌ ์ •์˜

  • layout.js๋Š” page.js์— importํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค.

  • ๋ผ์šฐํŠธ ๊ทธ๋ฃน์„ ํ†ตํ•ด ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

  • ๋ ˆ์ด์•„์›ƒ์€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋‹ค

import './globals.css';

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  )
}

7. getStaticProps(SSG)

  • ์ •์  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(๊ธฐ๋ณธ๊ฐ’)

  • ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์ž‘์„ฑ

  • async / await ๊ตฌ๋ฌธ ์‚ฌ์šฉ

  • https://beta.nextjs.org/docs/data-fetching/fetching

export default async function Page() {
  const data = await getData();
  return <main></main>;
}
async function getData() {
  const res = await fetch('https://api.example.com/...');
  return res.json();
}

8. getServerSideProps(SSR)

  • ๋™์  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

  • { cache: 'no-store' } ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ fetch

export default async function Page() {
  const data = await getData();
  return <main></main>;
}
async function getData() {
  const res = await fetch('https://api.example.com/...', { cache: 'no-store' });
  return res.json();
}

9. generateStaticParams(์ •์  ๊ฒฝ๋กœ)

  • ์ •ํ•ด์ง„ ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

  • paths์˜ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฐ’๋งŒ ๊ฒฝ๋กœ๋กœ ํ•˜์—ฌ ์ƒ์„ฑ

export const dynamicParams = false;

export async function generateStaticParams() {
  const paths = await getAllPostIds();
  return paths;
}

9.1 ์ •์  ๊ฒฝ๋กœ + ์ •์  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ๊ตฌ ๋ฒ„์ „: getStaticPaths + getStaticProps

  • app router ๋ฒ„์ „: generateStaticParams + ์‚ฌ์šฉ์ž์ž„์˜ํ•จ์ˆ˜

import { getAllPostIds, getPostData } from "@/lib/posts";

export const dynamicParams = false; // getStaticPaths์˜ fallback: false๊ณผ ๋™์ผ

export default async function Post({ params }) {
  const { id } = params;
  const postData = await getStaticPost(id);
  return (
    <>
      {postData.title}
      <br />
      {postData.id}
      <br />
      {postData.date}
    </>
  );
}

export async function generateStaticParams() {
  const paths = await getAllPostIds();
  return paths;
}

export async function getStaticPost(id) {
  const postData = await getPostData(id);
  return postData;
}

10. ๋™์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

  • https://nextjs.org/blog/next-13-2

Last updated