๐Ÿ“† 22.10.28 - NextJS + Typescript & ์ง€๋‚œ ์ฃผ์ฐจ ์ฒซ ๋ฐฑ์—”๋“œ์™€์˜ ํ˜‘์—….. ๊ทธ๋ฆฌ๊ณ  ์˜์™ธ์˜ ๋‚œํ•ญ?

๋ฒ„๋“คยท2022๋…„ 10์›” 28์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
12/62
post-thumbnail

๋ฐฑ์—”๋“œ์™€์˜ ์ฒซ ํ˜‘์—…... ์ˆœํƒ„ํ•  ์ค„ ์•Œ์•˜์ง€๋งŒ ๐Ÿšข

์ผ๋‹จ ์ง€๋‚œ ์ฃผ์ฐจ, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ฆ‰ ํ•ญํ•ด 6์ฃผ์ฐจ๋•Œ ์ฒ˜์Œ์œผ๋กœ ๋ฐฑ์—”๋“œ ๋ถ„๋“ค๊ณผ ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜์—ฌ ์กฐ๊ทธ๋งŒํ•œ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹ค๋“ค ์—ด์˜๊ฐ€ ๋Œ€๋‹จํ•˜์—ฌ ๊ฐˆ๋“ฑ ๋“ฑ์˜ ๋ถ€์ •์ ์ธ ๋ชจ์Šต์€ ์ฐพ์•„๋ณผ ์ˆ˜๊ฐ€ ์—†์—ˆ๊ณ , ์˜คํžˆ๋ ค ์„œ๋กœ๋ฅผ ๋ฐฐ๋ คํ•˜๋ ค๊ณ  ๋งŽ์ด ์‹ ๊ฒฝ์“ฐ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฐฐํฌ๊ณผ์ •์—์„œ ์ฒซ ํ˜‘์—…์ด ์–ด๊ธ‹๋‚˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋จผ์ € ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์€ ์›๋ž˜ ๋ฐฐํฌํ•˜๋˜ ์‚ฌ์ดํŠธ๋“ค (versel, netlify ๋“ฑ)์—์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์ด ๋“ค์–ด์žˆ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ํ•œ ๋’ค, gitignore.git ํŒŒ์ผ๋กœ ๊ฑธ๋Ÿฌ์ง€๋Š” API ์ฃผ์†Œ๋ฅผ ๋ฐฐํฌ ์‚ฌ์ดํŠธ ๋‚ด์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋”ฐ๋กœ ์ง€์ •ํ•˜์—ฌ ๋ฐฑ์—”๋“œ ํŒ€์—์„œ ์ œ์ž‘ํ•œ API ์ฃผ์†Œ๋ฅผ ํ”„๋ก ํŠธ ๋‹จ์—์„œ ์‚ฌ์šฉํ•œ axios instance์— ์ ์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋ฐฐํฌํ•œ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ? ๋ง‰์ƒ ์‚ฌ์šฉ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ์—” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋ก๋œ ์ฃผ์†Œ๊ฐ€ " " ์— ๊ฐ์‹ธ์ ธ ์žˆ์–ด์„œ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ธ๊ฐ€? ๋ผ๋Š” ์˜๋ฌธ์œผ๋กœ ์‹œ์ž‘๋˜์–ด ์ˆ˜๋„ ์—†์ด ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜์˜€๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ ๋ฐฑ์—”๋“œ ๋‹จ์—์„œ ๊ฐœ๋ฐœํ•œ ์„œ๋ฒ„๋Š” http๋กœ ๋ฐฐํฌ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ”„๋ก ํŠธ ๋‹จ์—์„œ ๋ฐฐํฌํ•œ ์‚ฌ์ดํŠธ๋Š” https๋กœ ๊ตฌ๋™๋˜๋Š” ์‚ฌ์ดํŠธ์ด๋ผ, ์„œ๋กœ๊ฐ„์˜ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ๊ทธ ์‚ฌ์‹ค์„ ์ธ์ง€ํ•˜๊ณ  ๋” ์ ๊ทน์ ์ธ ์†Œํ†ต์„ ํ†ตํ•ด ๋งž์ถ”์—ˆ๋‹ค๋ฉด, ์ œ ์‹œ๊ฐ„ ๋‚ด์— ๋ฐฐํฌํ•œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์•„์‰ฌ์šด ์ฃผ์ฐจ์˜€์ง€๋งŒ, Masonry Grid๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ๋‚ด๊ฒ ๋‚˜๋ฆ„ ์˜๋ฏธ์žˆ๋Š” ์ฃผ์ฐจ์˜€๋‹ค.

Next.js

NextJs๋ž€?

์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ํ˜•์‹์€ ๊ฑฐ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ˆ๊นŒ) React์—์„œ ์šด์šฉํ•˜๋˜ ๋ Œ๋”๋ง ๋ฐฉ์‹์€ CSR์ด๋‹ค. ์—ฌ๊ธฐ์„œ SSR ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” React์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด NextJS ์ด๋‹ค.

๏ผŠ ๊ฐ„๊ฒฐํ•˜๊ฒŒ NextJS์˜ ์žฅ์ ์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

  • ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํŒŒ์ผ์„ ์ €์žฅ์„ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ์ ์ด ํ”„๋ก ํŠธ ์„œ๋ฒ„์— ์ ์šฉ์ด ๋˜์–ด ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์•„๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • router ๋ฅผ ๊น”์ง€ ์•Š์•„๋„ NextJS ์ž์ฒด์—์„œ ์š”๊ตฌํ•˜๋Š” ํด๋” ๋ฐ ํŒŒ์ผ ์ด๋ฆ„์„ ํ™œ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ผ์šฐํŒ… ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์œ„์—์„œ ์„ค๋ช…ํ•œ๋ฐ๋กœ SSR์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SEO ๊ตฌํ˜„์—์„œ๋„ ํฐ ์žฅ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ์„ ์œ„ํ•˜์—ฌ webpack์ด๋‚˜ babel์„ ๊ฑด๋“ค์ผ ํ•„์š” ์—†์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์š”์†Œ๋ฅผ ๋”ฐ๋กœ ์ถ”๊ฐ€๋งŒ ํ•ด์ค€ ํ›„, ์„œ๋ฒ„ ์‹คํ–‰๋งŒ ํ•œ๋‹ค๋ฉด ์ž๋™์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝํŒŒ์ผ์ธ tsconfig.ts next-end.d.ts ๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค.

์„ค์น˜

npx create-next-app [ํ”„๋กœ์ ํŠธ ์ด๋ฆ„]

๋งŒ์•ฝ ํƒ€์ž…์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด

npx create-next-app --typescript

๋ผ์šฐํŒ… ์„ค์ •

์ด์ „์— react์—์„œ ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ผ์šฐํŒ…ํ•˜๋ฉด ๋˜์ง€๋งŒ next์˜ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

์ •์  ๋ผ์šฐํŒ… (static routing)

๋ณด๋‹ˆ๊นŒ next๋Š” ํด๋” ๊ตฌ์„ฑ์—์„œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋œ ๊ฒฝ๋กœ๋Œ€๋กœ ๋ผ์šฐํŒ…์ด ๋˜๋Š” ๋“ฏ ํ•˜๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด pages/shop/Brand.js๋ผ๊ณ  ํด๋” ๊ตฌ์„ฑ์ด ๋˜์žˆ๋‹ค๋ฉด, pages๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ชจ์•„๋‘๋Š” ํด๋”๋กœ ๋ถ€ํ„ฐ ๋ผ์šฐํ„ฐ ์ฃผ์†Œ๋Š” shop/Brand๊ฐ€ ๋œ๋‹ค.

๋™์  ๋ผ์šฐํŒ… (dynamic routing)

  • pages/shop/[brands].js -> /shop/:brands (/shop/nike)

// [brands].jsx

import {useRouter} from "next/router"

export default function brands() {
 const router = useRouter();
  
  const {brands} = router.query;
  
  return (
  	<div>
      <h1>shop/{brands}</h1>
    </div>
  )
}
  • pages/[username]/setting.js -> /:username/setting.js (/amy/setting)

-> ๋‹ค์ด๋‚˜๋ฏน ํด๋”๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•˜์œ„์— ๋‹ค์ด๋‚˜๋ฏน ๋ผ์šฐํ„ฐ ๊ฒฝ๋กœ๊ฐ€ ๋“ค์–ด์˜ค๋”๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ

  • pages/post/[...all].js -> /post/*(/post/2920/id/title)

๋™์  ๋ผ์šฐํ„ฐ์™€ ์ •์  ๋ผ์šฐํ„ฐ๊ฐ€ ๊ฐ™์ด ์žˆ์œผ๋ฉด ์ •์  ๋ผ์šฐํ„ฐ๊ฐ€ ์šฐ์„ ์œผ๋กœ

profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€