Next.js ์†Œ๊ฐœ ๐Ÿฅ‡

Sheryl Yunยท2023๋…„ 5์›” 20์ผ
0

๋ชฉ์ฐจ

  • Next.js๋ž€?
  • Next.js ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ
  • React์™€ Next.js์˜ ์ฐจ์ด์ 
  • Next.js ๊ฐœ๋ฐœํ•˜๊ธฐ
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ
    • ๋ฐ”๋ฒจ/์›นํŒฉ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

Next.js๋ž€?

  • ๋ฆฌ์•กํŠธ๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์˜คํ”ˆ์†Œ์Šค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ
    = ๋ฆฌ์•กํŠธ ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋‹ค์–‘ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์‹
    • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)
    • ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG)
    • ์ฆ๋ถ„ ์ •์  ์žฌ์ƒ์„ฑ(ISR)
    • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)
  • ์ˆ˜๋งŽ์€ ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ๊ณต
    • ์†Œ๊ทœ๋ชจ ์›น ์‚ฌ์ดํŠธ, ๊ฑฐ๋Œ€ํ•œ ์ƒ์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‘ ์ ์šฉ ๊ฐ€๋Šฅ

Next.js ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • ์›น ๊ฐœ๋ฐœ ๋ถ„์•ผ์˜ ๋ฐœ๋‹ฌ์— ๋”ฐ๋ผ
  • ๋™์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฆฌ์•กํŠธ ๋“ฑ์žฅ

๋ฆฌ์•กํŠธ์˜ ํฐ ๋ฌธ์ œ์ 

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)๋งŒ ๊ฐ€๋Šฅ
  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO) ๊ฑฐ์˜ ์•ˆ ๋จ
  • ์›น ์•ฑ์„ ์™„์ „ํžˆ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ „์ฒด ์›น์•ฑ ๋ฒˆ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•จ
    • ๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ฒซ ํ™”๋ฉด ํ‘œ์‹œ๊นŒ์ง€ ์ˆ˜ ์ดˆ๊ฐ€ ๊ฑธ๋ฆผ

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ์ œ์•ˆ

  • ๋ฆฌ์•กํŠธ ์•ฑ์„ ์ˆœ์ˆ˜ HTML ํŽ˜์ด์ง€๋กœ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•ด๋‘๊ณ 
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ž๋งˆ์ž HTML์„ ์ฆ‰๊ฐ ํ™”๋ฉด์— ํ‘œ์‹œ
      • ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋Š๊ปด์ง
    • ์ดํ›„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค๊นŒ์ง€ ๋‹ค์šด๋˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›น์•ฑ๊ณผ ์ƒํ˜ธ ์ž‘์šฉ

Next.js ๋“ฑ์žฅ

  • Vercel์ด ๊ฐœ๋ฐœ

๋ฆฌ์•กํŠธ๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต

  • ์ฝ”๋“œ ๋ถ„ํ•  (code splitting)
  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง (SSR)
  • ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… (=> react-router-dom ๋ถˆํ•„์š”)
  • ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ pre-fetching (preload ๊ธฐ๋Šฅ)
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์–‘์ธก์—์„œ ๋ชจ๋‘ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

๊ทธ ์™ธ ๊ธฐ๋Šฅ

  • ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG) ๋ Œ๋”๋ง ๋ฐฉ์‹
  • ์ฆ๋ถ„ ์ •์  ์ปจํ…์ธ  ์ƒ์„ฑ(ISR) ๋ Œ๋”๋ง ๋ฐฉ์‹
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ์ง€์›
  • ์ž๋™ polyfill ์ ์šฉ
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  • ๊ตญ์ œํ™” ์ง€์› (i18n)
  • ์„ฑ๋Šฅ ๋ถ„์„

React์™€ Next.js์˜ ์ฐจ์ด์ 

  • Next.js์˜ ๊ธฐ๋ณธ ์ฒ ํ•™์€ ๋ฆฌ์•กํŠธ์™€ ๊ฑฐ์˜ ๋™์ผ
    • ์„ค์ •๋ณด๋‹ค ๊ด€์Šต (convention-over-configuration)
      • ๊ฐ€๋Šฅํ•œ ํ•œ ๋ณต์žกํ•œ ์„ค์ • ์—†์ด '๊ด€์Šต'๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์›น์•ฑ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
        • ์˜ˆ: ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ ์—†์ด ์–ด๋–ค ํŽ˜์ด์ง€๋Š” SSR์„ ์ ์šฉํ•˜๊ณ  ์–ด๋–ค ํŽ˜์ด์ง€๋Š” SSG ์ ์šฉ ๊ฐ€๋Šฅ (๊ฐ ํŽ˜์ด์ง€์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ฅผ exportํ•˜๋ฉด Next.js๊ฐ€ ๋‚˜๋จธ์ง€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌ)
  • ๋ฆฌ์•กํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Next.js๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • Next.js์—์„œ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
    • Node.js ์„œ๋ฒ„ ๊ธฐ๋ฐ˜
      • fetch, window, document์™€ ๊ฐ™์€ ์›น ๋ธŒ๋ผ์šฐ์ € ์ „์—ญ ๊ฐ์ฒด๋‚˜ canvas ๊ฐ™์€ HTML ์š”์†Œ๋Š” Next.js์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    • fs, child_process ๋“ฑ Node.js์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/API ์‚ฌ์šฉ ์‹œ
      • ๊ฐ ์š”์ฒญ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— Next.js๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€ ์ƒ์„ฑ ์‹œ์ ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌ
      • ์–ด๋–ค ๋ฐฉ์‹์„ ์“ฐ๋Š”์ง€๋Š” ๊ฐ ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ Œ๋”๋ง ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

Next.js ๊ฐœ๋ฐœํ•˜๊ธฐ

์„ค์น˜

create 'react' app ์•„๋‹ˆ๊ณ  create 'next' app

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

์‹คํ–‰

npm run dev // localhost:3000

๊ธฐ๋ณธ ํด๋” ๊ตฌ์กฐ

ํ•„์ˆ˜ ํด๋” 2๊ฐ€์ง€ (pages/, public/)

- README.md
- next.config.js
- node_modules/
- package-lock.json
- package.json
- pages/  => ํ•„์ˆ˜!
  - _app.js
  - api/  => ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํด๋”
    - hello.js
  - index.js
- public/  => ํ•„์ˆ˜!
  - favicon.ico
  - vercel.svg
- styles/
  - Home.module.css
  - globals.css

pages/ ํด๋”

  • ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ํด๋”
  • pages/ ํด๋” ์•ˆ์˜ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ํŽ˜์ด์ง€๊ฐ€ ๋จ
  • ํŒŒ์ผ ์ด๋ฆ„์ด ๊ณง ๋ผ์šฐํŒ… ๊ฒฝ๋กœ
    • ์˜ˆ: pages/about.js => http://localhost:3000/about

public/ ํด๋”

  • ์›น ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  public ํŽ˜์ด์ง€์™€ ์ •์  ์ปจํ…์ธ ๋ฅผ ํฌํ•จ
    • ์˜ˆ: ์ด๋ฏธ์ง€ ํŒŒ์ผ, ํฐํŠธ, (์ปดํŒŒ์ผ๋œ) CSS ์Šคํƒ€์ผ์‹œํŠธ, (์ปดํŒŒ์ผ๋œ) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋“ฑ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ

  • Next.js๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ํ”„๋ ˆ์ž„์›Œํฌ
    • ๊ณ ํ’ˆ์งˆ์˜ ํƒ€์ž… ์ •์˜ ์ง€์›

Next.js์—์„œ TS๋ฅผ ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  1. ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— tsconfig.json ํŒŒ์ผ ์ƒ์„ฑ

    • ์ด ๋•Œ๋Š” ํŒŒ์ผ ์•ˆ์— ์•„๋ฌด ๊ฒƒ๋„ ์—†์Œ
    • ํ•˜์ง€๋งŒ ์•„๋ž˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋‚˜๋ฉด ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์„ค์ • ๋‚ด์šฉ์ด ์—ฌ๊ธฐ์— ๊ธฐ๋ก๋จ
  2. npm run dev ์‹คํ–‰

  3. ํ„ฐ๋ฏธ๋„์„ ํ™•์ธํ•˜๋ฉด...

    It looks like you're trying to use Typescript but do not have the required package(s) installed. (ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์“ฐ๋ ค๊ณ  ํ•˜๋Š” ๊ฑฐ ๊ฐ™์€๋ฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜ ์•ˆ ๋˜์–ด ์žˆ์–ด)
    ... (ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ช…๋ น์–ด)

  4. ํ„ฐ๋ฏธ๋„์—์„œ ์•Œ๋ ค์ค€ ํŒจํ‚ค์ง€๋“ค(= ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ ์–ธ์–ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€) ์„ค์น˜

  • ์ฃผ์˜: ๊ฐœ๋ฐœ์—๋งŒ ์“ฐ์ด๋Š” ๊ฒƒ๋“ค์ด๋ฏ€๋กœ dev๋กœ ์„ค์น˜
npm install --save-dev typescript @types/react @types/node
  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(.js)์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(.ts)๋กœ ์ˆ˜์ •
  1. ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ next-env.d.ts
  • ์ด ํŒŒ์ผ์€ ๋งˆ์Œ๋Œ€๋กœ ์ˆ˜์ •ํ•ด๋„ ๋˜์ง€๋งŒ ์ง€์šฐ๋ฉด ์•ˆ ๋จ

๋ฐ”๋ฒจ๊ณผ ์›นํŒฉ ์„ค์ • ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ฐ”๋ฒจ์ด๋ž€?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠธ๋žœ์Šค์ปดํŒŒ์ผ๋Ÿฌ(transcompiler)
  • ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌ์‹ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ํ˜ธํ™˜๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
  • ECMAScript ๋ช…์„ธ๋กœ ๋ฐœํ‘œ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹ ๊ธฐ๋Šฅ์„ ์ง€๊ธˆ ํ™˜๊ฒฝ์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
    • ์˜ˆ: Node.js๋Š” export default ํ‚ค์›Œ๋“œ๋ฅผ ๋ชจ๋ฅด์ง€๋งŒ ๋ฐ”๋ฒจ ์„ค์ •์„ ํ•˜๋ฉด ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋ฐ”๋ฒจ ์„ค์ • ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

  • ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— .babelrc ํŒŒ์ผ ์ƒ์„ฑ
    • ์•„๋ž˜๋Š” ์ตœ์†Œํ•œ ๋“ค์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ
      = Vercel ํŒ€์—์„œ ๋ฏธ๋ฆฌ ์„ค์ •ํ•œ ๋ฐ”๋ฒจ ์„ค์ •
  {
      "presets": ["next/babel"]
  }

์›นํŒฉ์ด๋ž€?

  • ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํŽ˜์ด์ง€, ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ํฌํ•จํ•˜๋Š” ๋ฒˆ๋“ค ์ƒ์„ฑ
    • ์˜ˆ: ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ 3๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํŽ˜์ด์ง€
      • ์ด๊ฑธ ์›นํŒฉ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋กœ ํ•ฉ์ณ์คŒ
  • ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ž์›(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ, CSS, SVG ๋“ฑ)์— ๋Œ€ํ•ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ, ๋ฒˆ๋“ค, ์ตœ์†Œํ™” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ์ธํ”„๋ผ(infrastructure)
    • ์˜ˆ: CSS ์ „์ฒ˜๋ฆฌ๊ธฐ(SASS)๋ฅผ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง์— ์‚ฌ์šฉํ•  ๋•Œ
      • ์›นํŒฉ ์„ค์ •์„ ์ˆ˜์ •ํ•ด์„œ SASS ํŒŒ์ผ์„ ์ฒ˜๋ฆฌ ํ›„ CSS ํŒŒ์ผ์„ ๋งŒ๋“ค๋„๋ก ํ•จ

๋ฐ”๋ฒจ/์›นํŒฉ ์œ ์˜์‚ฌํ•ญ

  • ๊ธฐ๋ณธ ๋ฐ”๋ฒจ ์„ค์ •์ด๋‚˜ ์›นํŒฉ ์„ค์ •์„ ์ž์œ ๋กญ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ
  • ํ•˜์ง€๋งŒ '์„ค์ •๋ณด๋‹ค๋Š” ๊ด€์Šต'์ด๋ผ๋Š” ์ทจ์ง€ ํ•˜์— ์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ ์„ค์ •์„ ๋ฐ”๊พธ๊ธฐ๋ณด๋‹ค๋Š” Next.js๊ฐ€ ์ง€์ •ํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ผ ๊ฐœ๋ฐœํ•  ์ผ์ด ๋” ๋งŽ์Œ
    • ๋นŒ๋“œ ๊ณผ์ •์„ ๊ผญ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ next.config.js๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„
    • next.config.js์—์„œ ๋ณ€๊ฒฝํ•  ์„ค์ •์„ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ export๋กœ ๋‚ด๋ณด๋‚ด๋ฉด ํ•ด๋‹น ๊ฐ’์ด Next.js์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ๋ฎ์–ด์”€
// next.config.js

module.exports = {
	// ๋ณ€๊ฒฝํ•œ ์„ค์ • ๊ฐ’ (๊ฐ์ฒด - key: value ํ˜•ํƒœ)
}
  • ์˜ˆ: ๊ธฐ๋ณธ ์›นํŒฉ ์„ค์ • ๊ฐ’์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด?
    • next.config.js์˜ ๊ฐ์ฒด์˜ 'webpack'์ด๋ผ๋Š” key์— ์ƒˆ๋กœ์šด ๊ฐ’ ์ง€์ •
// ์›นํŒฉ ๋กœ๋”์— ์ปค์Šคํ…€ํ•œ loader ์ถ”๊ฐ€ํ•˜๊ธฐ (์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ ์•„๋‹˜)
module.exports = {
	webpack: (config, options) => {
    	config.module.rules.push({
        	test: /\.js/,
            use: [
            	options.defaultLoaders.babel,
                {
                	loader: "my-custom-loader", // ์‚ฌ์šฉํ•  ์ปค์Šคํ…€ ๋กœ๋”
                    options: loaderOptions, // ์ปค์Šคํ…€ ๋กœ๋”์˜ ์˜ต์…˜
                },
            ],
        });
        
        return config;
    },
}
profile
๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค (ํ‹ฐ์Šคํ† ๋ฆฌ์— ๊ธฐ๋ก: https://cherylog.tistory.com/)

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