"μμΈμ λΉ΅μ§μ νννκ³ , λλ§μ λΉ΅μ§λλ₯Ό μ±μκ°λ λ°λ»ν νλ°© μλΉμ€"
μμΈ νμ MVP λ²μ
- Next.js 14+ (App Router) νλ‘μ νΈ μμ±
- TypeScript μ€μ
- Tailwind CSS 컀μ€ν ν λ§ (λΉ΅μ§ κ°μ±)
- ν΄λ ꡬ쑰 (
/app,/components,/lib,/types) - νκ²½ λ³μ μ€μ
- Supabase ν΄λΌμ΄μΈνΈ (client, server, middleware)
- TypeScript νμ μ μ
- DB μ€ν€λ§ SQL (
users,bakeries,reviews) - μλ λ°μ΄ν° (μμΈ λΉ΅μ§ 10κ°)
- RLS μ μ±
- νλ¨ λ€λΉκ²μ΄μ λ°
- λ‘κ·ΈμΈ λͺ¨λ¬ (Email Magic Link)
- Auth Server Actions
- νλ‘ν νμ΄μ§ μ€μΌλ ν€
- νΌλ νμ΄μ§ μ€μΌλ ν€
- Kakao Map ν΅ν©
- 컀μ€ν λΉ΅μ§ λ§μ»€ (π)
- λ§μ»€ ν΄λ¦ μ΄λ²€νΈ
- νλ¨ μνΈ (λΉ΅μ§ λ―Έλ¦¬λ³΄κΈ°)
- λΉ΅μ§ μμΈ νμ΄μ§
- API μλν¬μΈνΈ (
/api/bakeries)
.env.local νμΌμ΄ μ΄λ―Έ μμ±λμ΄ μμ΅λλ€:
μ€μ: μμ§ Supabaseμμ SQLμ μ€ννμ§ μμλ€λ©΄ λ°λμ μ€ννμΈμ!
- Supabase Dashboard μ μ
- νλ‘μ νΈ:
vetpzzvvdkpjgqdywflbμ ν - μ’μΈ‘ λ©λ΄ > SQL Editor ν΄λ¦
- μλ νμΌ λ΄μ©μ μμλλ‘ λ³΅μ¬ & μ€ν:
supabase/migrations/001_initial_schema.sqlsupabase/migrations/002_seed_data.sql
μμΈν μ€λͺ
: supabase/README.md μ°Έκ³
npm install # μ΄λ―Έ μ€μΉλ¨
npm run dev # μ΄λ―Έ μ€ν μ€λΈλΌμ°μ μμ http://localhost:3000 μ μ
| νμ΄μ§ | κ²½λ‘ | μ€λͺ |
|---|---|---|
| πΊοΈ ν (μ§λ) | / |
Kakao Map κΈ°λ° λΉ΅μ§ νμ |
| π° νΌλ | /feed |
리뷰 νΌλ (μ€μΌλ ν€) |
| π€ νλ‘ν | /profile |
λ‘κ·ΈμΈ/μ° λͺ©λ‘ |
| π λΉ΅μ§ μμΈ | /bakeries/:id |
λΉ΅μ§ μ 보 μμΈ λ³΄κΈ° |
components/
βββ layout/
β βββ Navigation.tsx # νλ¨ λ€λΉκ²μ΄μ
λ°
β βββ AuthModal.tsx # λ‘κ·ΈμΈ λͺ¨λ¬
βββ map/
β βββ KakaoMap.tsx # μΉ΄μΉ΄μ€λ§΅ μ»΄ν¬λνΈ
β βββ BottomSheet.tsx # λΉ΅μ§ λ―Έλ¦¬λ³΄κΈ° μνΈ
βββ ui/
βββ Button.tsx # λ²νΌ
βββ Input.tsx # μ
λ ₯ νλ
βββ Modal.tsx # λͺ¨λ¬
| κ΅¬λΆ | κΈ°μ |
|---|---|
| Frontend | Next.js 16 (App Router), TypeScript, Tailwind CSS |
| Backend | Next.js API Routes, Server Actions |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth (Email Magic Link) |
| Map | Kakao Maps SDK |
| Storage | Supabase Storage (μ€λΉ μ€) |
| Deploy | Vercel (μμ ) |
bread-trip/
βββ app/ # Next.js App Router
β βββ actions/ # Server Actions
β β βββ auth.ts
β βββ api/ # API Routes
β β βββ bakeries/
β βββ auth/ # μΈμ¦ κ΄λ ¨
β βββ bakeries/[id]/ # λΉ΅μ§ μμΈ
β βββ feed/ # νΌλ
β βββ profile/ # νλ‘ν
β βββ page.tsx # ν (μ§λ)
βββ components/ # React μ»΄ν¬λνΈ
β βββ layout/
β βββ map/
β βββ ui/
βββ lib/ # μ νΈλ¦¬ν°
β βββ supabase/ # Supabase ν΄λΌμ΄μΈνΈ
β βββ utils.ts
βββ types/ # TypeScript νμ
β βββ database.ts # DB νμ
β βββ common.ts # κ³΅ν΅ νμ
β βββ kakao.d.ts # Kakao Maps νμ
βββ supabase/ # Supabase μ€μ
β βββ migrations/ # SQL λ§μ΄κ·Έλ μ΄μ
β βββ README.md
βββ public/ # μ μ νμΌ
- λΉ΅μ§ λ±λ‘ νΌ
- Kakao μ£Όμ κ²μ API
- μ΄λ―Έμ§ μ λ‘λ (Supabase Storage)
- λ±λ‘ API
- 리뷰 μμ± λͺ¨λ¬
- 리뷰 API
- 무ν μ€ν¬λ‘€
- 리뷰 μΉ΄λ μ»΄ν¬λνΈ
- μ΄λ―Έμ§ μ΅μ ν
- λ‘λ©/μλ¬ μν κ°μ
- GA4 μ΄λ²€νΈ
- Vercel λ°°ν¬
- Supabase SQL μ€ν νμ: λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό μλμΌλ‘ μ€νν΄μΌ ν©λλ€
- μ°νκΈ° 미ꡬν: UIλ μμ§λ§ λ°±μλ μ°λ νμ
- 리뷰 미ꡬν: νΌλμ 리뷰 μμ± κΈ°λ₯μ Phase 5μμ ꡬν μμ
- μ΄λ―Έμ§ μ λ‘λ 미ꡬν: Storage μ€μ ν ꡬν μμ
- μΈμ¦ μν κ΄λ¦¬: νλ‘ν νμ΄μ§μμ μ€μ μ μ μ 보 μ°λ νμ
--cream-beige: #F6E9D8 /* ν¬λ¦Όλ² μ΄μ§ */
--brown: #8B5E3C /* λΈλΌμ΄ */
--white-warm: #FFF9F4 /* λ°λ»ν νμ΄νΈ */μ¬μ© μ:
<div className="bg-cream text-brown">GET /api/bakeries # λΉ΅μ§ λͺ©λ‘ μ‘°ν
POST /api/bakeries # λΉ΅μ§ λ±λ‘ (μΈμ¦ νμ)
GET /api/bakeries/:id # λΉ΅μ§ μμΈ μ‘°νusers: μ¬μ©μ μ 보bakeries: λΉ΅μ§ μ 보reviews: 리뷰 (μ€λΉλ¨, λ―Έμ¬μ©)
- Kakao Maps API ν€ νμΈ
- λΈλΌμ°μ μ½μμμ μλ¬ νμΈ
window.kakaoκ°μ²΄ λ‘λ νμΈ
- Supabase URL/Key νμΈ
- Supabaseμμ SQL μ€ν μ¬λΆ νμΈ
- RLS μ μ± νμΈ
npm run buildTypeScript μλ¬κ° λ°μνλ©΄ νμ μ μ νμΈ
MIT
- μ μ : μμΈ μλ λΉ΅μ§ 50κ° λ±λ‘
- μ°Έμ¬: μ§λ ν΄λ¦λ₯ 40% μ΄μ
- μ μ§: D7 μ¬λ°©λ¬Έμ¨ 20% μ΄μ