๐Ÿ Next๋กœ Delivero ํด๋ก ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.js(React), GraphQL, Strapi ๋ฐ Stripe-๐Ÿ—๏ธ ์„ค์ • (1/7 ์„น์…˜)

15530 ๋‹จ์–ด reactgraphqltutorialbeginners
์ด ๊ฐ•์ขŒ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์— ์ ์šฉ๋  ๊ฒƒ์ด๋‹ค.GraphQL, Stripe, Strapi, React ์ปจํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ํ”„๋ŸฐํŠธ์—”๋“œ Nuxt(Vue)์˜ js(React)
๋†€๋ผ์šด ๊ธฐ์ˆ ๋กœ Deliveroo ํด๋ก  ๊ฐœ๋ฐœ ์ค€๋น„: Next.jsReact,GraphQL,Stripe,Strapi!๋“ฑ๋ก๋ถ€ํ„ฐ ์ฃผ๋ฌธ๊นŒ์ง€ ์‹๋‹น, ์š”๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ฆ๊ฑฐ์šด ์ •์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์€ ๋‹น์‹ ์„ ๋ฐฐ๊ณ ํ”„๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ : *์†Œ์Šค ์ฝ”๋“œ*๋Š” GitHub์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.https://github.com/strapi/strapi-examples/tree/master/nextjs-react-strapi-deliveroo-clone-tutorial*.
์ตœ์ข… ์ œํ’ˆ ์บก์ฒ˜:



์Šคํ…”๋ผํ”ผ:


Strapi ๋Š” ๊ฐ€์žฅ ์„ ์ง„์ ์ธ ๊ฐœ์› ๋…ธ๋“œ์ด๋‹ค.js Headless ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ์ƒ์‚ฐ ๊ฐ€๋Šฅํ•œ API๋ฅผ ์‹ ์†ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ฌด์ˆ˜ํ•œ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ–ˆ๋‹ค.
ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์œผ๋กœ ๊ด€๋ฆฌ ํŒจ๋„, ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ, ์ปจํ…์ธ  ๊ด€๋ฆฌ, API ์ƒ์„ฑ๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ CMS์™€ ๋‹ฌ๋ฆฌ Strapi๋Š” 100% ์†Œ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค GitHub repository.
  • ์Šคํ…”๋ผํ”ผ๋Š” ์™„์ „ํžˆ ์ž์œ ๋กญ๋‹ค.
  • ์ž์‹ ์˜ ์„œ๋ฒ„์— ์œ„ํƒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œjs:


    Next ๋Š” ๊ฒฝ๋Ÿ‰๊ธ‰ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ React์—์„œ ์ •์ , ์„œ๋ฒ„๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๋‹ค์Œjs๋Š” ์ฝ”๋“œ ๋ถ„ํ• , HMR(์—ด๋ชจ๋“ˆ ๊ต์ฒด), SSR(์„œ๋ฒ„์ธก ๋ Œ๋”๋ง) ๋“ฑ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌด๊ฑฐ์šด ์—…๋ฌด๋ฅผ ๋งก๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ฐ˜์‘:


    React๋Š” ๊ฐ€์žฅ ์œ ํ–‰ํ•˜๋Š” ์ „๋‹จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ๊ณ  ์ˆ˜๋งŽ์€ ๊ณผํ•™๊ธฐ์ˆ ํšŒ์‚ฌ(Netflix, Airbnb, Github ํฌํ•จ)์— ์˜ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์ถ•์— ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.React๋Š” ์„ฑ๋ช…์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ƒํ˜ธ์ž‘์šฉ์‹ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๋Š” ์ฒด๊ณ„ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์กฐ์ง์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ทธ๋ž˜ํ”ฝ QL:


    GraphQL๋Š” ํŽ˜์ด์Šค๋ถ์ด ๊ฐœ๋ฐœํ•œ ์กฐํšŒ ์–ธ์–ด๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์‰ฝ๊ฒŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” API์ด๋‹ค.๋ชจ๋“  ์กฐํšŒ๋Š” ํ˜„์žฌ ๋ณด๊ธฐ์—์„œ ๋ณด์—ฌ์•ผ ํ•  ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.์ด๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์–‘ํ•œ ์žฅ์น˜์™€ ํ™”๋ฉด ํฌ๊ธฐ๋ฅผ ๋›ฐ์–ด๋„˜์–ด ๋›ฐ์–ด๋‚œ ์‚ฌ์šฉ์ž ์ฒดํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ค„๋ฌด๋Šฌ:


    Stripe๋Š” ํ˜„์žฌ ์‘์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒฐ์ œ ํ”„๋กœ์„ธ์„œ ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค.Stripe๋Š” ์ด๋Ÿฌํ•œ ๋„๊ตฌ์™€ SDK๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•ˆ์ „ํ•˜๊ณ  ๊ทœ์ •์— ๋งž๋Š” ์ง€๋ถˆ ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‰ฝ๊ฒŒ ์œตํ•ฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

    ์นดํƒˆ๋กœ๊ทธ

  • ๐Ÿ—๏ธ (1๋ถ€) - ์ „๋ฅ˜
  • ๐Ÿ  (์„น์…˜ 2)
  • ๐Ÿ” (3 ์„น์…˜)
  • ๐Ÿ” (4์„น์…˜)
  • ๐Ÿ›’ (์ œ5๋ถ€)
  • ๐Ÿ’ต (6 ์„น์…˜)
  • ๐Ÿš€ (7 ์„น์…˜)
    ## ๐Ÿ—๏ธ ์„ค์ •
  • ๋‹ค์Œ


    ๋‹ค์Œ ์„ค์ •.๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋นˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    ์šฐ๋ฆฌ๋Š” ํ•ญ๋ชฉ์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ๊ฒƒ์ด๋‹ค. ์ผ๋ถ€๋Š” ์•ž๋ถ€๋ถ„(Next.js ์ฝ”๋“œ)์— ์‚ฌ์šฉ๋˜๊ณ , ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ๋’ท๋ถ€๋ถ„(Strapi ์ฝ”๋“œ)์— ์‚ฌ์šฉ๋œ๋‹ค.
    mkdir strapi-deliveroo
    cd strapi-deliveroo
    mkdir frontend
    cd frontend
    
    yarn add next react react-dom
    
    ์ฃผ์˜: ์ €๋Š” yarn์„ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ๋„ npm์™€executenpm install --save next react react-dom๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.package.json ํŒŒ์ผ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    "scripts": {
      "dev": "next",
      "build": "next build",
      "start": "next start"
    }
    
    ๋”ฐ๋ผ์„œ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์„ค์น˜ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํŒจํ‚ค์ง€ ์ข…์†์„ฑ์— ๋”ฐ๋ผ ๋ฒ„์ „์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
    {
      "dependencies": {
        "next": "^7.0.2",
        "react": "^16.6.1",
        "react-dom": "^16.6.1",
      },
      "scripts": {
        "dev": "next",
        "build": "next build",
        "start": "next start"
      }
    }
    
    ๋‹ค์Œjs๋Š” /pages ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” JavaScript ํŒŒ์ผ์„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฃจํŠธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.์„ค์ •์„ ํ•˜๋ ค๋ฉด /pages ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  index.js ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    mkdir pages
    cd pages
    touch index.js
    
    ์ด์ œ ๊ธฐ๋ณธ ๊ฒฝ๋กœ (index.js) ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € URL์ด ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์„ ๋•Œ๋งˆ๋‹ค (์ฆ‰, www.yourapp.com ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ธ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.js ํŒŒ์ผ:
    export default () => <div>Welcome to next.js!</div>
    
    ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ dev ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    yarn dev
    
    ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ง€๊ธˆ http://localhost:3000 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ.gitignore๋ฅผ ๋งŒ๋“ค๊ณ  .next ๋ฐ node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    cd ..
    touch .gitignore
    
    /* .gitignore */
    node_modules
    .next
    
    ๋ถ€ํŠธ ์ถ”๊ฐ€
    ์ด ๊ฐ•์ขŒ์—์„œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ Bootstrap 4๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด react-strap ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.CSS ์Šคํƒ€์ผ์˜ ๊ฒฝ์šฐ CDN์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    ๋จผ์ € Reactstrap ์„ค์น˜:
    yarn add reactstrap bootstrap
    
    reactstrap์€ ํ”„๋ŸฐํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์•ˆ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์™€ ์Šคํƒ€์ผ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    CSS๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์ง€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์‚ฌ์šฉ์ž ์ •์˜ _app.js ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ์ด ํŒŒ์ผ์€ ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฎ์–ด์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๋‹ค์Œ js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ „์—ญ ์Šคํƒ€์ผ/๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•œ ์œ„์น˜์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์—ฌ๊ธฐ์—์„œ _app.js ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://nextjs.org/docs/#custom-app.
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ <Head> ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ œ๋ชฉ ์•ˆ์— ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    cd pages
    touch _app.js
    
    ๊ฒฝ๋กœ: /frontend/pages/_app.js

    ํ˜„์žฌ, ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ index.js์—reactstrap ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„์— ์‘์šฉํ•˜๋Š” ์•ˆ๋‚ด ์Šคํƒ€์ผ์„ ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค


    ๊ฒฝ๋กœ: /frontend/pages/index.js





    ์ƒˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค



    Designing the page


    ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ์ค‘ ์•ˆ๋‚ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.js ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ณต์œ  ์ „๋‹จ ๊ตฌ์„ฑ ์š”์†Œ, ์˜ˆ๋ฅผ ๋“ค์–ดnavbar


    ์šฐ์„  ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ์šฐ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.


    cd ..
    mkdir components
    cd components
    touch Layout.js
    

    Nextjs๋Š” <Link> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์‚ฌ์ด์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ฃจํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.๋งํฌ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ณ ๊ธ‰ ๊ตฌ์„ฑ ์š”์†Œ์ผ ๋ฟ, onClick ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” html ํ‘œ์‹œ<a>, <button>, <div> ๋“ฑ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


    ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€reactstrap ๋ฌธ์„œ ๋ฐ–์—์„œ ์•ฝ๊ฐ„์˜ ์ˆ˜์ •์„ ํ•ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์„ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ด๋‹ค.๋„ค๋น„๊ฒŒ์ด์…˜ ํ‘œ์‹œ์ค„์„ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์šฐ๋ฆฌ๋Š” nextjs๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒจ๋ถ€ํ•œ ๋‚ด์žฅ CSS-in-JS<style jsx>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


    JS์— CSS ์‚ฝ์ž…:


    <style jsx> {`
      a { color: yellow }
    `}
    </style>
    

    ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSS ๋ฒ”์œ„๋ฅผ ์Šคํƒ€์ผ ํƒœ๊ทธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์—ญ ์˜ต์…˜์„ ๋ถˆ๋Ÿฌ์™€์„œ ์ „์—ญ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: <style jsx global>


    ๋‹ค์Œ ๋ฌธ์„œhere์—์„œ JS์˜ CSS์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


    Layout.js ํŒŒ์ผ์„ ์—ด๊ณ  ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ดํ”„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. (์ž ์‹œ ํ›„ ์‚ฌ์šฉ) ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


    ๊ฒฝ๋กœ: /frontend/components/Layout.js





    ์ƒˆ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ํŽธ์ง‘index.js:


    ๊ฒฝ๋กœ: /frontend/pages/index.js





    ํ˜„์žฌ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณต์œ  ์ œ๋ชฉ ํ‘œ์‹œ์ค„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:



    ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ๊ฐ /signin๊ณผ /signup์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ๋‘ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค


    next๊ฐ€ ๋ฃจํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด /pages ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค


    cd ..
    cd pages
    
    touch signin.js
    touch signup.js
    

    ์•„๋ž˜ ์ฝ”๋“œ๋กœ ํŒŒ์ผ์„ ์ฑ„์šฐ๋ฉด Strapi ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•œ ํ›„ ์ด ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค


    ๊ฒฝ๋กœ: /frontend/pages/signup.js





    ๊ฒฝ๋กœ: /frontend/pages/signin.js







    ๋‹น์‹ ์€ ์ง€๊ธˆ http://localhost:3000์—์„œ ๋…ธ์„ ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค


    Strapi


    ์ „๋ฉด์€ ์ข‹์ง€๋งŒ, ๋‹น์‹ ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋ถ„๋ช…ํžˆ ์‚ฌ์šฉ์ž, ์‹๋‹น, ์š”๋ฆฌ์™€ ์ฃผ๋ฌธ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.์ด ๊ธฐ์ ์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด Strapi


    Install Strapi


    ์š”๊ตฌ์‚ฌํ•ญ: ์‚ฌ์šฉNode 9(๋˜๋Š” ๊ทธ ์ด์ƒ)์„ ํ™•์ธํ•˜๊ณ  ๊ธฐ๊ณ„์— ์„ค์น˜/์‹คํ–‰MongoDB,Postgres ๋˜๋Š” MySQL


    npm๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Strapi ์„ค์น˜:


    npm i strapi@alpha -g
    

    ์ฃผ์˜: Strapi v3๋Š” ์—ฌ์ „ํžˆ ์•ŒํŒŒ ๋ฒ„์ „์ด์ง€๋งŒ ๋ณธ ๊ฐ•์ขŒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


    Generate a Strapi project


    ๋‹จ์ผ ๋ช…๋ นํ–‰์„ ํ†ตํ•ด strapi-deliveroo API๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค:


    backend๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— strapi ์„œ๋ฒ„ ์„ค์น˜:


    cd ..
    cd ..
    strapi new backend
    

    CLI์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: MongoDB, Postgres ๋˜๋Š” MySQL์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ชฌ๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์•ž์˜ GraphQL ์กฐํšŒ์—์„œ _id ํ•„๋“œ๋ฅผ id๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)๋งŒ์•ฝ ์ปดํ“จํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์„ ์ •ํ™•ํ•˜๊ฒŒ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค


    ์ฃผ์˜: ๋ณธ ๊ฐ•์ขŒ๋Š” MongoDB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. strapi ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด strapi ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— Mongo ์‹ค๋ก€๋ฅผ ์‹œ์ž‘ํ•˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


    MongoDB ์„ค์น˜ ํƒ์ƒ‰(MacOS์˜ ๊ธฐ๋ณธ ์„ค์ •)


    cd ~./data/db
    mongod 
    

    ๋กœ์ปฌ ์‹œ์Šคํ…œ์—์„œ MongoDB ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ Strapi ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค


    Start the server


    ์‹œ์ž‘ ๋…ธ๋“œ.js ์„œ๋ฒ„:


    cd backend
    strapi start
    


    ์ง€๊ธˆ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ ํŒจ๋„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: http://localhost:1337/admin


    Create your first User


    registration page์—์„œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€



    ์ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ค์ •์„ ์„ฑ๊ณต์ ์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.js์™€ Strapi ํ”„๋กœ์ ํŠธ!๐ŸŽ‰


    ๐Ÿ  ๋‹ค์Œ ์ ˆ์—์„œ ๋‹น์‹ ์€ ์‹๋‹น ๋ชฉ๋ก์„ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•˜๋Š”์ง€ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ