๐ Next๋ก Delivero ํด๋ก ์ ๋ง๋ญ๋๋ค.js(React), GraphQL, Strapi ๋ฐ Stripe-๐๏ธ ์ค์ (1/7 ์น์ )
๋๋ผ์ด ๊ธฐ์ ๋ก 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๋ฅผ ๊ฐ๋ฐํ์ฌ ๊ฐ๋ฐ์๊ฐ ์์ ํ๊ณ ๊ท์ ์ ๋ง๋ ์ง๋ถ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์ตํฉ์ํฌ ์ ์๋๋ก ํ๋ค.
์นดํ๋ก๊ทธ
## ๐๏ธ ์ค์
๋ค์
๋ค์ ์ค์ .๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ํ๋ก์ ํธ ๋ฃจํธ๋ฅผ ๊ด๋ฆฌํ ๋น ๋๋ ํฐ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํญ๋ชฉ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ๊ฒ์ด๋ค. ์ผ๋ถ๋ ์๋ถ๋ถ(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 ํ๋ก์ ํธ!๐
๐ ๋ค์ ์ ์์ ๋น์ ์ ์๋น ๋ชฉ๋ก์ ์ด๋ป๊ฒ ํ์ํ๋์ง ๋ฐฐ์ธ ๊ฒ์ ๋๋ค:
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ Next๋ก Delivero ํด๋ก ์ ๋ง๋ญ๋๋ค.js(React), GraphQL, Strapi ๋ฐ Stripe-๐๏ธ ์ค์ (1/7 ์น์ )), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/ryanaz/-cooking-a-deliveroo-clone-with-nextjs-react-graphql-strapi-and-stripe----setup-part-17-kedํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)