AI κΈ°λ° λ©ν° νλ«νΌ μ½ν μΈ μμ± μλΉμ€
μ¬μ©μκ° μμ°μ΄λ‘ μ λ ₯νλ©΄ AIκ° ν°μ€ν 리, λ―Έλμ, μ νλΈ, μΈμ€νκ·Έλ¨μ μ΅μ νλ μ½ν μΈ λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- π€ AI μ½ν μΈ μμ±: Claude APIλ₯Ό νμ©ν κ³ νμ§ μ½ν μΈ
- π― 4κ° νλ«νΌ μ§μ: ν°μ€ν 리, Medium, YouTube, Instagram
- π λ§ν¬λ€μ΄ ν리뷰: μμ±λ μ½ν μΈ λ₯Ό λ°λ‘ νμΈ
- π μν΄λ¦ 볡μ¬: 볡μ¬νμ¬ λ°λ‘ μ¬μ©
- πΎ νμ€ν 리 κ΄λ¦¬: μμ±ν μ½ν μΈ κΈ°λ‘ λ³΄κ΄
- Free Tier: 1κ° νλ«νΌ, μ 10ν μμ±
- Pro Tier ($9.99/μ): 4κ° νλ«νΌ λμ μμ±, 무μ ν
- Frontend: Next.js 14, TypeScript, Tailwind CSS
- Backend: Next.js API Routes
- Database: Supabase (PostgreSQL)
- AI: Anthropic Claude API
- Auth: Supabase Auth
- Payment: Stripe
- Hosting: Vercel
cd content-creator-saas
npm install.env.exampleμ .env.localλ‘ λ³΅μ¬νκ³ κ°μ μ±μλλ€:
cp .env.example .env.localAnthropic Claude API
- Anthropic Consoleμ κ°μ
- API ν€ μμ±
ANTHROPIC_API_KEYμ μ λ ₯
Supabase
- Supabaseμ κ°μ
- μ νλ‘μ νΈ μμ±
- Settings > APIμμ λ€μ κ° λ³΅μ¬:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY
Supabase SQL Editorμμ lib/db/schema.sql νμΌμ λ΄μ©μ μ€νν©λλ€:
-- users, content_generations, subscriptions ν
μ΄λΈ μμ±
-- Row Level Security (RLS) μ€μ
-- νΈλ¦¬κ±° λ° ν¨μ μμ±μ£Όμ ν μ΄λΈ:
users: μ¬μ©μ μ 보content_generations: μμ±λ μ½ν μΈ νμ€ν 리subscriptions: ꡬλ μ 보
npm run devλΈλΌμ°μ μμ http://localhost:3000 μ΄κΈ°
content-creator-saas/
βββ app/
β βββ api/ # API μλν¬μΈνΈ
β β βββ generate/ # μ½ν
μΈ μμ± API
β β βββ history/ # νμ€ν 리 μ‘°ν/μμ API
β βββ (auth)/ # μΈμ¦ νμ΄μ§
β βββ (dashboard)/ # λμ보λ νμ΄μ§
β β βββ generate/ # λ©μΈ μμ± νμ΄μ§
β β βββ history/ # νμ€ν 리 νμ΄μ§
β βββ page.tsx # λλ© νμ΄μ§
βββ components/
β βββ generate/ # μμ± κ΄λ ¨ μ»΄ν¬λνΈ
β βββ PlatformSelector.tsx # νλ«νΌ μ νκΈ°
β βββ PromptInput.tsx # ν둬ννΈ μ
λ ₯
β βββ ContentPreview.tsx # μ½ν
μΈ ν리뷰
βββ lib/
β βββ ai/
β β βββ claude.ts # Claude API λνΌ
β β βββ prompts.ts # νλ«νΌλ³ ν둬ννΈ
β βββ db/
β βββ supabase.ts # Supabase ν΄λΌμ΄μΈνΈ
β βββ schema.sql # λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§
βββ types/
β βββ content.ts # μ½ν
μΈ κ΄λ ¨ νμ
β βββ user.ts # μ¬μ©μ κ΄λ ¨ νμ
βββ package.json
POST /api/generate
Authorization: Bearer <token>
Body:
{
"prompt": "AI νΈλ λμ λν μ½ν
μΈ ",
"platforms": ["tistory", "medium"],
"targetAudience": "κ°λ°μ"
}
Response:
{
"id": "uuid",
"status": "completed",
"results": {
"tistory": "<html>...</html>",
"medium": "# Title\n\nContent..."
},
"tokensUsed": 1500,
"createdAt": "2026-01-06T..."
}GET /api/history?page=1&limit=20
Authorization: Bearer <token>
Response:
{
"items": [
{
"id": "uuid",
"prompt": "...",
"platforms": ["tistory"],
"results": {...},
"createdAt": "..."
}
],
"total": 50,
"page": 1,
"totalPages": 3
}- νμ: HTML
- κΈΈμ΄: 1,500-3,000μ
- νΉμ§: SEO μ΅μ ν, ꡬ쑰νλ μΉμ
- νμ: Markdown
- κΈΈμ΄: 800-1,500λ¨μ΄
- νΉμ§: μ€ν 리ν λ§, μμ΄ μμ±
- νμ: Markdown
- ν¬ν¨: μ λͺ©, μ€λͺ , νμμ€ν¬ν, λλ³Έ
- νΉμ§: μμ²μ μ°Έμ¬ μ λ
- νμ: ν μ€νΈ
- ν¬ν¨: μΊ‘μ , μΊλ¬μ μ¬λΌμ΄λ, ν΄μνκ·Έ
- νΉμ§: μ΄λͺ¨ν°μ½ νμ©, μκ°μ ꡬμ±
1. νλ«νΌ μ ν (ν°μ€ν 리 μ ν)
β
2. ν둬ννΈ μ
λ ₯
"AI μ½λ© λꡬμ λ―Έλμ λν μ½ν
μΈ λ§λ€μ΄μ€"
β
3. νκ² μ€λμΈμ€ μ
λ ₯ (μ ν)
"κ°λ°μ"
β
4. μμ± λ²νΌ ν΄λ¦
β
5. AIκ° ν°μ€ν 리 μ΅μ ν HTML μμ±
β
6. ν리뷰 νμΈ λ° λ³΅μ¬/λ€μ΄λ‘λ
| κΈ°λ₯ | Free | Pro |
|---|---|---|
| νλ«νΌ μ ν | 1κ° | 4κ° λμ |
| μ μμ± νμ | 10ν | 무μ ν |
| νμ€ν 리 λ³΄κ΄ | 30μΌ | μꡬ |
| κ°κ²© | λ¬΄λ£ | $9.99/μ |
- GitHubμ μ½λ νΈμ
- Vercelμμ νλ‘μ νΈ μν¬νΈ
- νκ²½ λ³μ μ€μ
- λ°°ν¬!
ANTHROPIC_API_KEY=sk-ant-xxx
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJxxx
SUPABASE_SERVICE_ROLE_KEY=eyJxxx
NEXT_PUBLIC_APP_URL=https://yourdomain.com
- κΈ°λ³Έ μ½ν μΈ μμ±
- 4κ° νλ«νΌ μ§μ
- Free/Pro ꡬλΆ
- νμ€ν 리 κΈ°λ₯
- Stripe κ²°μ ν΅ν©
- μ¬μ©μ μΈμ¦ UI
- ν νλ¦Ώ μμ€ν
- λΈλλ ν€μ€λ§€λ μ€μ
- λ λ§μ νλ«νΌ (LinkedIn, Twitter, TikTok)
- AI μ΄λ―Έμ§ μμ± (DALL-E, Midjourney)
- ν νμ κΈ°λ₯
- μμ½ λ°ν
- λΆμ λμ보λ
Error: Failed to generate content
ν΄κ²°: ANTHROPIC_API_KEYκ° μ¬λ°λ₯Έμ§ νμΈ
Error: Failed to fetch user data
ν΄κ²°: Supabase URLκ³Ό ν€κ° μ¬λ°λ₯Έμ§ νμΈ, RLS μ μ± νμΈ
Error: Free tier allows up to 1 platform(s)
ν΄κ²°: Proλ‘ μ κ·Έλ μ΄λνκ±°λ 1κ° νλ«νΌλ§ μ ν
# κ°λ° λͺ¨λ μ€ν
npm run dev
# λΉλ ν
μ€νΈ
npm run build
npm startnpx tsc --noEmitSupabase SQL Editorμμ μ€ν€λ§ λ³κ²½ μ μ©
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
MIT License
- π§ Email: support@example.com
- π¬ Discord: Join our community
- π Docs: Documentation
Made with β€οΈ by [Your Name]