"Flora Bota" ์ฌ์ดํธ ๋ณด๊ธฐ: https://flora-bota.vercel.app/
์๊ฐ
์๋
๋ถํฐ ์ทจ๋ฏธ๋ก ๋ณดํ๋์ปฌ ์ํธ๋ฅผ ํ๊ณ ์์ด์. ์ ์ ๋ ์ฌ๋ฏธ์์ด์ ธ์ ์ง์งํ๊ฒ ๋ณดํ๋์ปฌ ์ํฐ์คํธ๊ฐ ๋๊ณ ์ถ๋ค๋ ๊ฟ์ ๊พธ๊ฒ ๋์์ด์. (์ํด ํ์? ๐)
Flora Kim์ด๋ผ๋ ๋ณดํ๋์ปฌ ์ํฐ์คํธ ํ๋ฅด์๋๋ฅผ ์ค์ ํ๊ณ ํผ์ค๋ ๋ธ๋๋ฉ ์ฌ์ดํธ "Flora Bota"๋ฅผ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌํด๋ณด์์ต๋๋ค.
์ฌ์ฉ๋๊ตฌ ๋ฐ ์ํฌํ๋ก์ฐ
Claude : ์ฌ์ดํธ ๊ธฐํ(๋ชฉํ, ๊ตฌ์กฐ, ๋์์ธ ๋ฑ)์ ์ํ ๋ธ๋ ์ธ ์คํ ๋ฐ, ์ ๋ฆฌ
PRD Builder GPTs : ์คํฐ๋์ฅ๋์ PRD Builder์ ๋ธ๋ ์ธ ์คํ ๋ฐ ์๋ฃ๋ฅผ ๋ฃ๊ณ PRD ์์ฑ
Cursor : PRD์ ๋ง์ถ์ด Todo List๋ฅผ ์์ฑํ๊ณ , ์์ฐจ์ ์ผ๋ก ์ฝ๋ ๊ฐ๋ฐ
OpenAI API : API Key๋ฅผ ํ๊ฒฝ ๋ณ์์ ์ ์ฅํ๊ณ , AI ์ฑ๋ด ๊ธฐ๋ฅ ๊ฐ๋ฐ
EmailJS : ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ด๋ฉ์ผ ๋ฐ์ก, ๋ฌธ์ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
Midjourney : ์ฌ์ดํธ์ ํฌํจ๋ ์ ์ฒด ๋ณดํ๋์ปฌ ์ํธ ์ด๋ฏธ์ง ์์ฑ
Github : Cursor์ ์ฐ๋ํ์ฌ ์ฌ์ดํธ ํ์ผ ๊ด๋ฆฌ
Vercel : Github์ ์ฐ๋ํ์ฌ ์ฌ์ดํธ ๋ฐฐํฌ
Perplexcity : Github์ Vercel์ ์ฌ์ฉ์ ์ํ ์ง์์๋ต
์ฌ์ดํธ ๊ฐ๋ฐ ๊ณผ์
1. ๊ฐ๋ฐ ๋ชฉํ
์ํฐ์คํธ์ ์์ ์ ์ ์ฒด์ฑ๊ณผ ์ฒ ํ์ ์ ๋ฐ์ํ๋ ๋ธ๋๋ฉ
์ํ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ํ ์ ์๋ ํฌํธํด๋ฆฌ์ค ๊ตฌ์ถ
์ํฌ์ ๋ฐ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ช ํํ๊ฒ ์ ๊ณตํ์ฌ ๋ฑ๋ก ์ ๋
์ฌ์ฉ์์์ ์ํต ์ฑ๋ ๋ค์ํ
2. ์ฃผ์ ๊ธฐ๋ฅ (PRD์ ๋ช ์)
๋ฉ์ธ ํ์ด์ง: ์ํฐ์คํธ ์๊ฐ ๋ฐ ์ํ ํ์ด๋ผ์ดํธ
ํฌํธํด๋ฆฌ์ค ๊ฐค๋ฌ๋ฆฌ: ์นดํ ๊ณ ๋ฆฌ๋ณ ์ํ ๋ถ๋ฅ ๋ฐ ์์ธ ๋ณด๊ธฐ
์ํฌ์/๊ฐ์: ์ผ์ , ๋ด์ฉ, ๊ฐ๊ฒฉ ์ ๋ณด ์ ๊ณต
์ ์ํ ์ ๋ณด: ๊ณผ๊ฑฐ์ ์์ ๋ ์ ์ํ ์ ๋ณด ํ์๋ผ์ธ
์ฐ๋ฝ์ฒ ๋ฐ ๋ฌธ์: ์ฐ๋ฝ์ฒ ์๋ด์ ํ์ ๋ฐ ์ํ ์๋ขฐ๋ฅผ ์ํ ๋ฉ์์ง๋ฅผ ์ด๋ฉ์ผ๋ก ๋ณด๋ด๊ธฐ
AI ์ฑ๋ด: ์ฌ์ดํธ ๋ฐฉ๋ฌธ์์ ์ง๋ฌธ์ ์ฆ์ ์๋ต ๊ฐ๋ฅํ ๋ํํ ์ธํฐํ์ด์ค
๋ฐ์ํ ๋์์ธ: ๋ชจ๋ ๋๋ฐ์ด์ค์ ์ต์ ํ
ํ์ด์ง ์ ํ ๋ฐ ์คํฌ๋กค ์ ๋๋ฉ์ด์
3. PRD์ Todo ์์ฑ (Cursor๋ก ๊ฐ๋ฐ)
PRD Builder GPTs์์ ์์ฑํ๊ณ ํ๋ก์ ํธ ํด๋์ prd.md๋ก ์ ์ฅ
PRD๋ฅผ ์ฐธ์กฐํด์ Todo ์์ฑ
@prd.md๋ฅผ ์ฐธ์กฐํด์ Todo.md ํ์ผ์ ์์ฑํด์ฃผ์ธ์. Todo์ task๋ค์ ์ต๋ํ ์์ ๋จ์๋ก ์์ฑํด์ฃผ์ธ์.
Todo์ ๋ง์ถ์ด ์์ฐจ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ
@Todo.md๋ฅผ ์ฐธ๊ณ ํด์ ์์ฐจ์ ์ผ๋ก ๊ฐ๋ฐ์ ์งํํด์ฃผ์ธ์.
4. ๊ธฐ์ ์คํ (Todo์ ๋ฐ๋ผ Cursor๊ฐ ์ค์น ๋ฐ ์งํ)
๊ฐ๋ฐ ๋๊ตฌ
Vite: ๋น ๋ฅธ ํ๋ก์ ํธ ๊ฐ๋ฐ ๋ฐ ๋น๋, React ๋ฑ ๋ค์ํ ํ๋ ์์ํฌ ์ง์
npm: ํ๋ก์ ํธ์ ์์กด์ฑ ๊ด๋ฆฌ
ํ๋ก ํธ์๋ ๊ธฐ์
React: ๋ณต์กํ UI ๊ด๋ฆฌ
Tailwind CSS: ์ผ๊ด๋ ๋์์ธ ์์คํ ๊ตฌํ
Framer Motion: ํ์ด์ง ์ ํ๊ณผ ์คํฌ๋กค ์ ๋๋ฉ์ด์ ๊ตฌํ
์ธ๋ถ ์๋น์ค
OpenAI API: ์ฌ์ดํธ์ AI ์ฑ๋ด ๊ธฐ๋ฅ ๊ตฌํ
EmailJS: ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ด๋ฉ์ผ ๋ฐ์ก, ๋ฌธ์ํ๊ธฐ์ ์ฐ๋
5. ๋์์ธ ์์คํ (PRD์ ๋ช ์)
์์ ํ๋ ํธ: ์์ฐ๊ณผ ๋ณดํ๋์ปฌ ์ํธ๋ผ๋ ์ฃผ์ ์ ๋ง์ถค, Colorhunt ์ฌ์ดํธ ์ฐธ์กฐ
ํ์ดํฌ๊ทธ๋ํผ: ์ธ๋ฆฌํ์ฒด์ ์ฐ์ธ๋ฆฌํ์ฒด์ ์กฐํ
์ ๋๋ฉ์ด์ : ํ์ด์ง ์ ํ, ์คํฌ๋กค ๊ธฐ๋ฐ, ๋ฒํผ๊ณผ ์นด๋ ์ธํฐ๋์ , ๊ทธ๋ผ๋ฐ์ด์ ๋ฐ ๋ฐฐ๊ฒฝ ํจ๊ณผ
๋ณดํ๋์ปฌ ์ํธ ์ด๋ฏธ์ง: Midjourney๋ก ์ฃผ์ ์ ๋ง๊ฒ ์์ฑ
6. ์ฌ์ดํธ ๊ตฌ์กฐ (Cursor๋ก ๊ฐ๋ฐ)
flora-bota/
โโโ public/ # ์ ์ ์์ฐ (์ด๋ฏธ์ง, ์์ด์ฝ ๋ฑ)
โ โโโ assets/ # ์ด๋ฏธ์ง ๋ฐ ๋ฏธ๋์ด ํ์ผ
โโโ src/ # ์์ค ์ฝ๋
โ โโโ components/ # ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ
โ โ โโโ Chatbot.jsx # AI ์ฑ๋ด ์ปดํฌ๋ํธ
โ โ โโโ Footer.jsx # ํธํฐ ์ปดํฌ๋ํธ
โ โ โโโ HeroSection.jsx # ํ์ด๋ก ์น์
์ปดํฌ๋ํธ
โ โ โโโ Layout.jsx # ๋ ์ด์์ ๋ํผ ์ปดํฌ๋ํธ
โ โ โโโ Navbar.jsx # ๋ค๋น๊ฒ์ด์
๋ฐ ์ปดํฌ๋ํธ
โ โโโ pages/ # ํ์ด์ง ์ปดํฌ๋ํธ
โ โ โโโ About.jsx # ์ํฐ์คํธ ์๊ฐ ํ์ด์ง
โ โ โโโ Collaboration.jsx # ํ์
ํ์ด์ง
โ โ โโโ Contact.jsx # ์ฐ๋ฝ์ฒ ๋ฌธ์ EmailJS ์ฐ๋ ํ์ด์ง
โ โ โโโ Exhibitions.jsx # ์ ์ํ ํ์ด์ง
โ โ โโโ Home.jsx # ํํ์ด์ง
โ โ โโโ NotFound.jsx # 404 ํ์ด์ง
โ โ โโโ Portfolio.jsx # ํฌํธํด๋ฆฌ์ค ํ์ด์ง
โ โ โโโ Workshops.jsx # ์ํฌ์ ํ์ด์ง
โ โโโ styles/ # ์คํ์ผ ๊ด๋ จ ํ์ผ
โ โ โโโ index.css # ์ ์ญ CSS ๋ฐ Tailwind ์ง์์ด
โ โ โโโ tailwind.css # Tailwind CSS ์ถ๊ฐ ์คํ์ผ
โ โโโ App.jsx # ๋ฉ์ธ ์ฑ ์ปดํฌ๋ํธ ๋ฐ ๋ผ์ฐํ
โ โโโ main.jsx # ์ฑ ์ํธ๋ฆฌ ํฌ์ธํธ
โโโ dist/ # ๋น๋ ๊ฒฐ๊ณผ๋ฌผ (์๋ ์์ฑ)
โโโ node_modules/ # ์์กด์ฑ ํจํค์ง (์๋ ์์ฑ)
โโโ .env.local # ๋ก์ปฌ ํ๊ฒฝ ๋ณ์ (API Key, EmailJS ์ค์ )
โโโ .gitignore # Git ์ ์ธ ํ์ผ ๋ชฉ๋ก
โโโ LICENSE # ๋ผ์ด์ ์ค ํ์ผ
โโโ index.html # HTML ํ
ํ๋ฆฟ
โโโ package.json # ์์กด์ฑ ๋ฐ ์คํฌ๋ฆฝํธ
โโโ package-lock.json # ์์กด์ฑ ์ ๊ธ ํ์ผ
โโโ postcss.config.js # PostCSS ์ค์
โโโ tailwind.config.js # Tailwind CSS ์ค์
โโโ vercel.json # Vercel ๋ฐฐํฌ ์ค์
โโโ vite.config.js # Vite ์ค์
7. AI ์ฑ๋ด (API ์ฐ๋, Cursor๋ก ๊ฐ๋ฐ)
OpenAI API ์ฐ๋: API Key ์์ฑ
API Key์ ์์ ํ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ: ๋ก์ปฌ ํ๋ก์ ํธ ๋ฃจํธ์ .env.local ํ์ผ ์์ฑ
๋ณด์ ๊ฐํ๋ฅผ ์ํด Git ๊ด๋ฆฌ์์ ์ ์ธ: .gitignore์ .env.local ํ์ผ ์ถ๊ฐ
์ฑ๋ด ์๋ต ์ต์ ํ
์๋ต ๊ธธ์ด ์กฐ์ , ์์คํ ํ๋กฌํํธ ์ต์ ํ, ๋๋ฉ์ธ ์ง์ ๊ฐํ, ํค์๋ ๊ธฐ๋ฐ ์๋ต ๋ณด์
8. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ด๋ฉ์ผ ๋ฐ์ก (EmailJS ์ฐ๋, Cursor๋ก ๊ฐ๋ฐ)
EmailJS ๊ฐ์ ํ ์ค์ ๋ก ์ฌ์ฉํ ์ด๋ฉ์ผ ์๋น์ค ์ฐ๊ฒฐ(Gmail ๋ฑ), ์ด๋ฉ์ผ ํ ํ๋ฆฟ ์์ฑ
(๋ฌด๋ฃ ํ๋์ผ๋ก ์ 200ํ ์ด๋ฉ์ผ ์ ์ก ๊ฐ๋ฅ)์๋น์ค ID, ํ ํ๋ฆฟ ID, Public Key ํ์ธ
.env.local ํ์ผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๊ฐ
# .env.local ํ์ผ VITE_OPENAI_API_KEY=your-api-key VITE_EMAILJS_SERVICE_ID=service-id VITE_EMAILJS_TEMPLATE_ID=template-id VITE_EMAILJS_PUBLIC_KEY=your-public-key
9. ์ฌ์ดํธ ๋ฒ์ ๊ด๋ฆฌ (Github)
Github์ ์๋ก์ด Repository "flora-bota" ์์ฑ
Cursor์ ํฐ๋ฏธ๋์์ Github์ ์ฐ๋ ๋ฐ ์ ๋ก๋
# ์ฒซ ์ฐ๊ฒฐ ์ git init # Git์ด๊ธฐํ git remote add origin https://github.com/AeonKim/flora-bota.git # ๋ ํฌ์งํ ๋ฆฌ์ ์ฐ๊ฒฐ # ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ก๋ํ ๋ git add . # ํ์ฌ ํด๋ ๋ด ๋ชจ๋ ๋ณ๊ฒฝ ํ์ผ์ ์คํ ์ด์ง git commit -m "update changes" # ๋ณ๊ฒฝ ์ฌํญ์ ๋ ํฌ์งํ ๋ฆฌ์ ๊ธฐ๋ก git push origin main # ์ปค๋ฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ํฌ์งํ ๋ฆฌ์ ์ ๋ก๋
10. ์ฌ์ดํธ ๋ฐฐํฌ (Vercel)
Vercel์ ๊ฐ์ ์ "Continue with GitHub"์ ์ ํํ์ฌ GitHub ๊ณ์ ๊ณผ ์ฐ๋
๋์๋ณด๋์์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉฐ Github์ "flora-bota" Repository๋ฅผ Import
ํ๋ ์์ํฌ ๋ฐ ๋น๋ ์ค์ (๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ค์ )
ํ๊ฒฝ๋ณ์๋ ์ง์ ๋ฑ๋ก
ํ๋ก์ ํธ - Settings - Environment Variables ๋ฉ๋ด
Key์ ํค์ ๋ช ์นญ, Value์ ํค ๊ฐ์ ์ ๋ ฅ ํ ์ ์ฅ
ํ๊ฒฝ๋ณ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ๊ฒฝ์ฐ ๋ฐ๋์ ์ฌ๋ฐฐํฌํด์ผ ๋ณ๊ฒฝ์ฌํญ ์ ์ฉ
ํ๋ก์ ํธ ์ค์ ์ ๋ง์น ํ "Deploy"ํ๋ฉด ์๋ ๋ฐฐํฌ
GitHub Repository์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด Vercel์ด ์๋์ผ๋ก ์ฌ๋ฐฐํฌ
404: NOT_FOUND ์ค๋ฅ ์ฃผ์
๋ฐฐํฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด๋, ์์ฒญํ ๊ฒฝ๋ก๋ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ง ๋ชปํ๋ ์ค๋ฅ
๋ฉ์ธ ํ์ด์ง flora-bota.vercel.app์ ์ ๋ณด์ด์ง๋ง, ๊ฐ๋ณ ํ์ด์ง์ธ flora-bota.vercel.app/exhibitions ๋ฑ์ผ๋ก ์ง์ ์ ๊ทผํ๋ฉด 404 ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
React, Vite ๋ฑ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ ๊ธฐ๋ฐ์ SPA(Single Page Application)์์ ์์ฃผ ๋ํ๋๋ ๋ผ์ฐํ ๋ฌธ์
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์
vercel.json
ํ์ผ์ ์ถ๊ฐํ์ฌ ํด๊ฒฐ{ "rewrites": [ { "source": "/(.*)", "destination": "/" } ] }
๋ชจ๋ ๊ฒฝ๋ก ์์ฒญ์ ๋ฃจํธ(/)๋ก ๋ฆฌ๋ค์ด๋ ํธํด, ํด๋ผ์ด์ธํธ ๋ผ์ฐํฐ๊ฐ ์ ์์ ์ผ๋ก ๋ผ์ฐํ ์ ํ๋๋ก ์ฒ๋ฆฌ
11. ์์ฑ ์ฌ์ดํธ ๋ณด๊ธฐ: https://flora-bota.vercel.app/
๊ฒฐ๊ณผ์ ๋ฐฐ์ด ์
์คํฐ๋์ฅ๋์ด ์๋ ค์ฃผ์ PRD์ Todo ๋ฆฌ์คํธ ์์ฑ ๊ทธ๋ฆฌ๊ณ ์์ฐจ์ ์ผ๋ก ๊ฐ๋ฐํ๋ผ๋ ํ๋กฌํํธ๊ฐ ์ ๋ง ์ ์ฉํ์ต๋๋ค. ๐ ์์ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ์ดํ ๊ณผ์ ์ด ์ฌ์์ก์ด์.
React์ npm์ด ๋ฌด์์ธ์ง ๋ชฐ๋ผ๋ Cursor๊ฐ ์์์ ์ค์นํ๊ณ , ์คํจํ๋ฉด ๊ธฐํนํ๊ฒ๋ ๐ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ฐพ์ ๊ณ์ ๋ค์ ์ค์นํด์ฃผ์ด ์ฌ์ดํธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ์ต๋๋ค.
์ฒ์์ ํ์ผ์ ์ฐพ์ ์์ค๋ฅผ ๋ณด๋ ๊ฒ์ด ๋ณต์กํด์ Cursor์ ์คํผ๋ ์ด์ ์ ๋ญ๋นํ๋ฉฐ ์์ฒญ์ ํ์์ต๋๋ค. ์ ์ฐจ ์ต์ํด์ง๋ ์ฝํ ์ธ ๋ ์ด๋ฏธ์ง ํ์ผ๋ช ์์ ๋ฑ์ ์์ค๋ฅผ ๋ณด๊ณ ์ง์ ์์ ํ ์ ์์์ด์.
Github๋ ์ฌ์ ํ ์ด๋ ต๊ณ , Vercel๋ ๋ฏ์ค์์ง๋ง Perplexcity์ Claude์ ๋์์ผ๋ก ๋ฐฐํฌ์ ์ฑ๊ณตํ์ต๋๋ค.
๋น๊ฐ๋ฐ ์๊ฐ ์งง์ ๊ธฐ๊ฐ ์์ ์ฒ์ ๊ณํํ๋ ์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๊ณ , AI ์ฑ๋ด์ ๊ตฌํํ ๊ฒ์ ๋ง์กฑํฉ๋๋ค. ์์ง ๋๋ฌด ๋ถ์กฑํ์ง๋ง, Cursor๋ฅผ ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋ง์ด ๋ฐฐ์ ์ด์!
์ฌ์ดํธ ๊ธฐ๋ฅ ํ์ฅ์ผ๋ก ํ์ ์์คํ , ์ํฌ์ ์์ฝ ์์คํ , ์จ๋ผ์ธ ๊ฒฐ์ ์์คํ ์ฐ๋์ ์๊ฐํด๋ณด์์ต๋๋ค. Supabase ๋ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ๋ถํฐ ํด๋ณด๋ ค๊ณ ์~ ๐