[Next.js] Next.js ๊ธฐ๋ณธ ๊ฐœ๋…
728x90

Today, What I learned?

๋ฆฌ์•กํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Next.js์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.

Next.js๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ๋„์ž…๋˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€์™€ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ๋‹ค๋ฅธ ์ ๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

 

 

Next.js ๋Š” ์–ด์ฉŒ๋‹ค๊ฐ€ ํƒ„์ƒํ–ˆ์„๊นŒ?

Next.js๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ํ”„๋ ˆ์ž„์›Œํฌ(SSR)๋‹ค.

๊ธฐ์กด ๋ฆฌ์•กํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์ธ๋ฐ, CSR์€ SPA๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์›นํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ €์˜ ํŽธ์˜์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ ธ์„œ ์ดˆ๊ธฐ ๋กœ๋”ฉ์†๋„๊ฐ€ ์ฆ๊ฐ€๋˜์—ˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

 

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋งŒ์„ ๋กœ๋”ฉํ•˜๋Š” ์ฝ”๋“œ๋ถ„ํ• (Code Split, Lazy-loading)์„ ์ ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ!.. CSR์€ ๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ index.html์„ ๋ Œ๋”๋ง ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กค๋ง์— ํ•„์š”ํ•œ ์‚ฌ์ดํŠธ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ SEO์— ๋ถˆ๋ฆฌํ•˜๋‹ค๋Š” ์ ์ด ์žˆ์—ˆ๋‹ค.

์†๋„๊ฐ€ ๋น ๋ฅด๋ฉด์„œ SEO๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—†์„๊นŒ?.. ๐Ÿค” ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜์˜ Next.js, ๋ทฐ ๊ธฐ๋ฐ˜์˜ Nuxt.js ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

 

 

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

Next.js ๊ณต์‹๋ฌธ์„œ์— ๊ฐ€๋ฉด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ์•„์ฃผ ๋ฉ‹์ง„ ํ”„๋ ˆ์ž„์›Œํฌ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ๊ณผ ๋™์  ๋ผ์šฐํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ ,

๊ฐ ํŽ˜์ด์ง€์˜ HTML์„ ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง(pre-rendering)ํ•˜๋Š” ๊ฒƒ๊ณผ SSG์™€ SSR์„ ๋ชจ๋‘ ์ œ๊ณตํ•œ๋‹ค.

๋˜ API Routes๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์—†์ด ๊ฐ„๋‹จํ•œ API๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

npx create-next-app ํ”„๋กœ์ ํŠธ๋ช…

yarn create next-app ํ”„๋กœ์ ํŠธ๋ช…

 

 

 

Next.js ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋œฏ์–ด๋ณด๊ธฐ

package.json

ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๊ณ  ๋‚˜์„œ package.json์˜ script๋ฅผ ๋ณด๋ฉด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์™€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ๊ฐ ์ด๋ ‡๋‹ค.

  • dev : ๊ฐœ๋ฐœ๋ชจ๋“œ๋กœ ํ”„๋กœ์ ํŠธ ์‹คํ–‰. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.
  • build : ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ(๋ฐฐํฌ์šฉ)๋กœ ๋นŒ๋“œํ•˜์—ฌ .next ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ฐฐํฌ์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ๋ชจ๋“œ์˜ ๊ธฐ๋Šฅ๋“ค์ด ๋น ์ง„๋‹ค.
  • start : ๋นŒ๋“œ๋œ ํŒŒ์ผ์„ ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•ด ์ค€๋‹ค. (๋จผ์ € ๋นŒ๋“œ๊ฐ€ ๋˜์–ด์žˆ์–ด์•ผ ํ•จ)

 

pages ํด๋”

์œ„์—๋„ ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ next.js๋Š” ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด๋‹ค. pages ์•ˆ์˜ ๊ฐ ํด๋”๋ช…์ด ์ฃผ์†Œ ์—ญํ• ์„ ํ•˜๊ณ , ๋‚ด๋ถ€ ํŒŒ์ผ๋“ค์ด ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ผ ๋•Œ post ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ http://localhost:3000/post/1 ์ด ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

 

_app.js

pages ํด๋” ๋‚ด์—์„œ๋„ ๊ฐ€์žฅ ๋จผ์ € ๋ Œ๋”๋ง ๋˜๋Š” ํŒŒ์ผ์ด๋‹ค.

import '../styles/globals.css' 

function MyApp({ Component, pageProps }) { 
    return <Component {...pageProps} /> 
} 

export default MyApp

<Component> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์— ํ•ด๋‹นํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๊ณตํ†ต์ ์ธ ๋ ˆ์ด์•„์›ƒ(ํ—ค๋”๋‚˜ ํ‘ธํ„ฐ.. ๋“ฑ)๊ณผ global CSS๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

 

index.html์˜ ๋ถ€์žฌ

next.js๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์ฒ˜๋Ÿผ index.html ํŒŒ์ผ์„ ๋ฐ”๋กœ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์—†๋‹ค.
๊ทธ๋Ÿผ index.html ์˜ <head> ํƒœ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋˜ ๊ฒƒ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋„ฃ์–ด์ฃผ๋Š”์ง€?...๐Ÿค”

๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ์ธ <Head> ์ปดํฌ๋„ŒํŠธ๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

import '../styles/globals.css';
import Head from 'next/head';

function MyApp({ Component, pageProps }) {
  return (
    <div>
     <Head>
        <title>My page title</title>
        <meta property="og:title" content="My page title" key="title" />
      </Head>
      <Head>
        <meta property="og:title" content="My new title" key="title" />
      </Head>
      <p>Hello world!</p>
      <Component {...pageProps} />
    </div>
  );
}

export default MyApp;

 

 

 

Next.js์˜ ๊ธฐ์ดˆ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.
๋ฆฌ์•กํŠธ์™€ ๊ตฌ์กฐ๊ฐ€ ์‚ด์ง ๋‹ค๋ฅด๊ธด ํ•˜์ง€๋งŒ ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ•˜๋ฉฐ!.. ๐Ÿฅบ

728x90