๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- React, Next.js

[์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next js] create-next-app์œผ๋กœ Next ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…ํ•˜๊ณ  next js์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

by Wonit 2020. 12. 28.

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ์‹œ๋ฆฌ์ฆˆ๋Š” ์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next js ์‹œ๋ฆฌ์ฆˆ๋กœ์จ ์ด 10๋ถ€์ž‘์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
Next.js๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋‚ด์šฉ์„ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

0. ๋ชฉ์ฐจ

1. create-next-app์œผ๋กœ next ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…ํ•˜๊ธฐ

2. create-next-app์—์„œ ๋งŒ๋‚œ ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ pages. ๊ทธ๋ฆฌ๊ณ  ๋™์  ๋ผ์šฐํŒ…

3. ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Link-Component ๊ทธ๋ฆฌ๊ณ  Pre-Fetch

Dynamic Routing๊ณผ Link๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

4. Next.js์—์„œ head ํƒœ๊ทธ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•

๋ฒˆ์™ธ & ์‹ค์Šต) ์ด๋ฏธ์ง€์™€ ๋™์˜์ƒ์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด์ž.

5. ์›น์˜ ๋ฐœ์ „ ๊ณผ์ •์œผ๋กœ ๋ณด๋Š” SSG์™€ SSR

6. next์˜ ๋‘ ๋ฒˆ์งธ ํ•ต์‹ฌ Pre-Rendering

7. SSG๋กœ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” ๋…ธ๋ฆฌ๊ธฐ

8. ์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next.js ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งˆ์น˜๋ฉฐ..


Next js๋Š” Server Side Rendering (SSR) ๊ณผ Pre-Rendering ๊ทธ๋ฆฌ๊ณ  Search Engine Optimize(SEO) ์— ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•™ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ React ์•ฑ์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ boiler plate ํ”„๋กœ์ ํŠธ์ธ create-react-app์„ ์ด์šฉํ–ˆ์—ˆ๋‹ค.

 

๊ทธ๋Ÿฐ create-react-app์—๋„ ํฐ ๋‹จ์ ์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ Single Page Application์ด๋ผ๋Š” ์ ์ด๋‹ค.


SPA์˜ ๋‹จ์ ์— ๋Œ€ํ•ด์„œ๋Š” ๊นŠ๊ฒŒ ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๊ฒ ๋‹ค.


๋‚ด ๋ธ”๋กœ๊ทธ๋กœ ์œ ์ž…๋œ ๋‹น์‹ ์€ ์ด๋ฏธ Next์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๊ณ  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…์ด ๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ์ด๋‹ˆ.

 

๊ทธ๋ž˜๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๊ธฐ ์ „์— ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.

Next JS์˜ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋Šฅ

  • Server Side Rendering ์ง€์›
  • ๋น ๋ฅด๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ Code Splitting
  • ํŽ˜์ด์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ Client Side Rendering ๋˜ํ•œ ์ œ๊ณต
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ Fast Refresh๊ฐ€ ๋จ
  • Express๋‚˜ Node ์„œ๋ฒ„์™€ ๋น ๋ฅด๊ฒŒ ํ˜ผ์šฉ ๊ฐ€๋Šฅ

์ด์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•ด๋ณด์ž.

Set-Up

Next Project๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๋Šฅํ•œ Node๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์ตœ์‹ ํ™” ํ•˜๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

 

Next๋Š” window, Mac, Linux ๋ชจ๋‘ ๋™์ž‘ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ node.js ์•„๋ž˜์„œ ๋Œ์•„๊ฐ€๊ธฐ ๋–„๋ฌธ์— node๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๊ฐ๊ฐ ์šด์˜์ฒด์ œ๋ณ„๋กœ ์„ค์น˜ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ mac์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

Project Set-Up ์€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” Blog ์˜ˆ์ œ๋กœ ๋งŒ๋“œ๋Š” create-next-app
  2. npm์„ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ next ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋‹ค ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ ์ƒ๋žตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” create-next-app์œผ๋กœ ์„ค๋ช…์„ ์ง„ํ–‰ํ•˜๊ฒ ๋‹ค.

 

1. Blog ์˜ˆ์ œ๋กœ ๋งŒ๋“œ๋Š” create-next-app

์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. npx ํ˜น์€ npm์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  2. ํ•ด๋‹น ๋””๋ž™ํ† ๋ฆฌ๋กœ ์ด๋™
  3. npm ๋ช…๋ น์–ด๋กœ next ํ”„๋กœ์ ํŠธ ์‹คํ–‰

npx ํ˜น์€ npm์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn-starter/tree/master/learn-starter"

npx ๋ช…๋ น์–ด๋กœ create-next-app์„ ์‹คํ–‰์‹œํ‚ค๋Š”๋ฐ, next js์—์„œ ์ œ๊ณตํ•˜๋Š” boiler project๋ฅผ github์—์„œ ๋‹ค์šด๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋Š”๋ฐ,

ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ•œ ๋ฒˆ ๋ด๋ณด์ž.

์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ์•„๋งˆ nextjs-blog ๋ผ๋Š” ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

cd nextjs-blog

์œผ๋กœ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์ฃผ์ž.

 

npm ๋ช…๋ น์–ด๋กœ next ํ”„๋กœ์ ํŠธ ์‹คํ–‰

 

npm ๋ช…๋ น์–ด๋Š” package.json์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ dev ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์— ์ž„ํ•  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ 

npm run dev

๋ช…๋ น์–ด๋ฅผ ์ณ์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ localhost:3000์—์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

2. npm์„ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ next ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

 

๋‹ค์Œ์€ npm์„ ์ด์šฉํ•ด์„œ ์ง์ ‘ next ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
  2. npm Init
  3. React, React Dom, Next ์„ค์น˜
  4. ๊ฐœ๋ฐœ๊ณผ ๋นŒ๋“œ ์‹คํ–‰์„ ์œ„ํ•œ package.json ์Šคํฌ๋ฆฝํŠธ ์„ค์ •

 

ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ

 

my-next-app ์ด๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.

 

mkdir my-next-app
cd my-next-app

npm Init

์ด์ œ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ npm ํ”„๋กœ์ ํŠธ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ npm init -y ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ ์œ„์˜ ํ„ฐ๋ฏธ๋„์ฒ˜๋Ÿผ ๋น„์–ด์žˆ๋Š” package.json ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

React, React Dom, Next ์„ค์น˜

 

์ด์ œ ํ•ด๋‹น npm ํ”„๋กœ์ ํŠธ๋ฅผ React์™€ Next๋ฅผ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

npm install --save react react-dom next

๊ทธ๋Ÿผ npm ๋ชจ๋“ˆ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ฒŒ๋˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ„ฐ๋ฏธ๋„ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

๊ฐœ๋ฐœ๊ณผ ๋นŒ๋“œ ์‹คํ–‰์„ ์œ„ํ•œ package.json ์Šคํฌ๋ฆฝํŠธ ์„ค์ •

 

์ด์ œ ๊ฐœ๋ฐœ๊ณผ ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด์„œ package.json์— npm script๋“ค์„ ์ถ”๊ฐ€์‹œ์ผœ๋ณด์ž.


์šฐ๋ฆฌ๋Š” next ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ npm run dev ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

vim package.json

vim ์œผ๋กœ package.json์— ๋“ค์–ด๊ฐ€๋ฉด script๊ฐ€ test๋ฐ–์— ์—†๋Š”๋ฐ ๋‹ค์Œ 3๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ €์žฅํ•ด๋ณด์ž.

 

"script" : {
    "dev": "next",
    "build": "next build",
    "start": "next start"
},

i๋กœ insert ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•˜๊ณ  esc + :wq ๋กœ ์ €์žฅํ•˜๊ณ  ๋น ์ ธ๋‚˜์˜ค์ž.

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์ด ๋‹ค ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  npm run dev ๋ช…๋ น์–ด๋ฅผ ์ณ์„œ next ์•ฑ์„ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

 

๋งŒ์•ฝ ์ด์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด

npm install react -y

๋ช…๋ น์–ด๋กœ ๋ฆฌ์•กํŠธ๋ฅผ ํ•œ๋ฒˆ ๋” ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  localhost;3000 ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด

์ด์™€ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์™€์•ผ ํ•œ๋‹ค.

 

์ด๋Š” ํ˜„์žฌ next ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๋ผ์šฐํŒ… ํ•ด์•ผํ•  ํŽ˜์ด์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋œป์ธ๋ฐ, ์œ„์™€ ๋‹ค๋ฅด๊ฒŒ ๋‹น์—ฐํžˆ ์šฐ๋ฆฌ๋Š” ์•„๋ฌด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋œจ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ˆ˜์ •ํ•˜๊ธฐ

๋งŒ์•ฝ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด pages ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


์„œ๋ฒ„๋ฅผ ์ผ  ์ƒํƒœ๋กœ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์—์„œ index.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด create-react-app๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ”๋กœ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋œ๋‹ค.


์ด๊ฒƒ์„ Fast Refresh๋ผ๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ž์„ธํ•œ ๊ฒƒ์€ Next ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์˜ What is Fast Refresh?์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์ž.


์ด๋ ‡๊ฒŒ npm ์œผ๋กœ next ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

 

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” next์—์„œ ๋ผ์šฐํŒ…์„ ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

์•ž์œผ๋กœ์˜ ๋ช‡๊ฐœ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์ด๋‹ˆ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋”ฐ๋ผ๊ฐ€๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™๋‹ค.

๋Œ“๊ธ€