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

[์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next js] create-next-app์—์„œ ๋งŒ๋‚œ ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ pages. ๊ทธ๋ฆฌ๊ณ  ๋™์  ๋ผ์šฐํŒ…

by Wonit 2020. 12. 29.

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ์‹œ๋ฆฌ์ฆˆ๋Š” ์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” 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 ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งˆ์น˜๋ฉฐ..


create-react-app ์—์„œ์˜ ๋ผ์šฐํŒ…

์šฐ๋ฆฌ๊ฐ€ ์›๋ž˜ react app ์—์„œ ๋ผ์šฐํŒ…์„ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ–ˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

 

์•„๋งˆ ๋Œ€๋ถ€๋ถ„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณค์—ˆ๋‹ค.

 

  1. npm ๋ชจ๋“ˆ๋กœ react-router-dom ์„ค์น˜
  2. BrowserRouter์„ App ์ปดํฌ๋„ŒํŠธ์— ๊ฐ์‹ธ๊ธฐ
  3. Link ํ˜น์€ NavLink๋กœ url ๋งคํ•‘
  4. Route์œผ๋กœ url์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

์ด๋Ÿฐ ๊ณผ์ •์ด ์•„์ฃผ ๋ณต์žกํ–ˆ์ง€๋งŒ ํฐ ํŠน์ง•์€ ๋ฐ”๋กœ Single Page Application์˜ ํŠน์„ฑ์„ ์ •ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ next js๋ฅผ ๋ฐฐ์šฐ๋ ค ํ•˜๋Š” ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„ ์ข€ ๋” ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•œ ssr์„ ์œ„ํ•ด์„œ์ผ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ๊ฐ„๋‹จํ•œ ๋ผ์šฐํŒ… ์œ ๋ช…ํ•œ next์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

create-next-app ์—์„œ์˜ ๋ผ์šฐํŒ…

next์—์„œ๋Š” pages๋ผ๋Š” ํด๋”๊ฐ€ ๋ผ์šฐํ„ฐ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์ด๋Š” Next js๋Š” file-system based ๋กœ ๋ผ์šฐํŒ…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด pages๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” js, jsx, ts tsx ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„์— ๋”ฐ๋ผ์„œ ๋ผ์šฐํŒ…์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์ œ ์šฐ๋ฆฌ๋Š” ์œ„์—์„œ ๋ดค๋˜ ๊ทธ ๊ท€์ฐฎ์€ ๊ณผ์ •๋“ค์—์„œ ํ•ด๋ฐฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ pages/about.js๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ  exportํ•œ๋‹ค๋ฉด, ์ฆ‰

function About() {
  return <div>์˜ค ๋„ฅ์ŠคํŠธ ์ฐธ ์‹ ๊ธฐํ•˜๋„ค์š”</div>
}

export default About

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” localhost:3000/about ์— ์ ‘๊ทผํ•˜๋ฉด ์˜ค ๋„ฅ์ŠคํŠธ ์ฐธ ์‹ ๊ธฐํ•˜๋„ค์š”๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ๋” ๋‚˜๊ฐ€์„œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ url path๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

Directory ๊ตฌ์กฐ์— ๋”ฐ๋ฅธ url path

pages ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์—์„œ๋Š” exportํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ผ์šฐํŒ…ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋””๋ ‰ํ† ๋ฆฌ์—์„œ index.js๋ฅผ ๋ผ์šฐํŒ…ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ๋ช…์ด ๋ฐ”๋กœ ์ฃผ์†Œ ๋ช…์ด ๋œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ์กฐ๊ธˆ ์˜์•„ํ•œ ์ ์ด ์žˆ๋‹ค.

 

์œ„์—์„œ user1 user2 user3๊ณผ ๊ฐ™์ด ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ํŽ˜์ด์ง€ (๊ฒŒ์‹œ๊ธ€ ์ˆ˜)๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

 

์œ„์˜ ์˜ˆ์ œ ์ฒ˜๋Ÿผ ์ผ์ผ์ด ๋งŒ๋“ค์–ด์•ผํ•˜๋‚˜?

 

๊ทธ๋Ÿด๋ฆฌ๊ฐ€ ์—†๋‹ค.

 

์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•ด์„œ Next์—์„œ๋Š” Dynamic Routing์„ ์ œ๊ณตํ•œ๋‹ค.

Next์˜ Dynamic Routing

์ผ๋ฐ˜์ ์ธ ์›น ํŽ˜์ด์ง€์—์„œ๋Š” ์œ„์˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์•„์ฃผ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œํŒ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ€์„ ์“ธ๋•Œ ๋งˆ๋‹ค url์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.


์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•ด์„œ Next.js ์—์„œ๋Š” ํŽ˜์ด์ง€ ํŒŒ๋ฆฌ๋ฏธํ„ฐ์— ๋Œ€๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ url์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


์ฆ‰ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค.

pages/user/[param].jsx

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์œ„์—์„œ ๋ดค๋˜ ๋ฌธ์ œ์— ์ ์šฉํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์—ฌ๊ธฐ์„œ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์˜ parameter ๊ฐ€ query parameter ๋กœ ํŽ˜์ด์ง€์— ์ „์†ก๋˜๊ณ  ๋‹ค๋ฅธ query parameter๊ณผ ํ•ฉ์ณ์ง€๊ฒŒ ๋œ๋‹ค.

 

์ด์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

[user].jsx

import { useRouter } from "next/router"; // query parameter ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด next์˜ router ํŒจํ‚ค์ง€์˜ useRouter๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

const User = () => {
  const router = useRouter();

  // router์˜ url ์ฟผ๋ฆฌ์— ์กด์žฌํ•˜๋Š” user ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋Š” [user].jsx์˜ user์™€ ๋Œ€์‘๋œ๋‹ค.
  const { user } = router.query;

  return <h3>์‚ฌ์šฉ์ž ์ด๋ฆ„: {user}</h3>;
};

export default User;

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ๋‹ค๋ฅธ query param์„ ์ฃผ๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์˜ parameter ๊ฐ€ query parameter ๋กœ ํŽ˜์ด์ง€์— ์ „์†ก๋˜๊ณ  ๋‹ค๋ฅธ query parameter๊ณผ ํ•ฉ์ณ์ง€๊ฒŒ ๋œ๋‹ค.

 

Path variable ๊ณผ Query Parameter ์˜ ๊ฐ’์„ ๋”ฐ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, router.query ์˜ ๊ฐ์ฒด ๊ฐ’์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

  • /post/abc ๋Š” {"pid": "abc"}
  • /post/abc?foo=bar ๋Š” { "foo": "bar", "pid": "abc" }

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋™์ ์ธ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ pages/post/[pid]/[comment].js๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ“๊ธ€