Skip to content

Latest commit

Β 

History

History
325 lines (254 loc) Β· 7.51 KB

File metadata and controls

325 lines (254 loc) Β· 7.51 KB

Content Creator SaaS

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

λΉ λ₯Έ μ‹œμž‘

1. ν”„λ‘œμ νŠΈ 클둠 및 μ˜μ‘΄μ„± μ„€μΉ˜

cd content-creator-saas
npm install

2. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

.env.example을 .env.local둜 λ³΅μ‚¬ν•˜κ³  값을 μ±„μ›λ‹ˆλ‹€:

cp .env.example .env.local

ν•„μˆ˜ ν™˜κ²½ λ³€μˆ˜

Anthropic Claude API

  1. Anthropic Console에 κ°€μž…
  2. API ν‚€ 생성
  3. ANTHROPIC_API_KEY에 μž…λ ₯

Supabase

  1. Supabase에 κ°€μž…
  2. μƒˆ ν”„λ‘œμ νŠΈ 생성
  3. Settings > APIμ—μ„œ λ‹€μŒ κ°’ 볡사:
    • NEXT_PUBLIC_SUPABASE_URL
    • NEXT_PUBLIC_SUPABASE_ANON_KEY
    • SUPABASE_SERVICE_ROLE_KEY

3. λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ •

Supabase SQL Editorμ—μ„œ lib/db/schema.sql 파일의 λ‚΄μš©μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:

-- users, content_generations, subscriptions ν…Œμ΄λΈ” 생성
-- Row Level Security (RLS) μ„€μ •
-- 트리거 및 ν•¨μˆ˜ 생성

μ£Όμš” ν…Œμ΄λΈ”:

  • users: μ‚¬μš©μž 정보
  • content_generations: μƒμ„±λœ μ½˜ν…μΈ  νžˆμŠ€ν† λ¦¬
  • subscriptions: ꡬ독 정보

4. 개발 μ„œλ²„ μ‹€ν–‰

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

API μ—”λ“œν¬μΈνŠΈ

μ½˜ν…μΈ  생성

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 μ΅œμ ν™”, κ΅¬μ‘°ν™”λœ μ„Ήμ…˜

Medium

  • ν˜•μ‹: Markdown
  • 길이: 800-1,500단어
  • νŠΉμ§•: μŠ€ν† λ¦¬ν…”λ§, μ˜μ–΄ μž‘μ„±

YouTube

  • ν˜•μ‹: Markdown
  • 포함: 제λͺ©, μ„€λͺ…, νƒ€μž„μŠ€νƒ¬ν”„, λŒ€λ³Έ
  • νŠΉμ§•: μ‹œμ²­μž μ°Έμ—¬ μœ λ„

Instagram

  • ν˜•μ‹: ν…μŠ€νŠΈ
  • 포함: μΊ‘μ…˜, μΊλŸ¬μ…€ μŠ¬λΌμ΄λ“œ, ν•΄μ‹œνƒœκ·Έ
  • νŠΉμ§•: 이λͺ¨ν‹°μ½˜ ν™œμš©, μ‹œκ°μ  ꡬ성

μ‚¬μš© μ˜ˆμ‹œ

1. μ½˜ν…μΈ  생성 ν”Œλ‘œμš°

1. ν”Œλž«νΌ 선택 (ν‹°μŠ€ν† λ¦¬ 선택)
   ↓
2. ν”„λ‘¬ν”„νŠΈ μž…λ ₯
   "AI μ½”λ”© λ„κ΅¬μ˜ λ―Έλž˜μ— λŒ€ν•œ μ½˜ν…μΈ  λ§Œλ“€μ–΄μ€˜"
   ↓
3. νƒ€κ²Ÿ μ˜€λ””μ–ΈμŠ€ μž…λ ₯ (선택)
   "개발자"
   ↓
4. 생성 λ²„νŠΌ 클릭
   ↓
5. AIκ°€ ν‹°μŠ€ν† λ¦¬ μ΅œμ ν™” HTML 생성
   ↓
6. 프리뷰 확인 및 볡사/λ‹€μš΄λ‘œλ“œ

2. 무료 vs Pro 비ꡐ

κΈ°λŠ₯ Free Pro
ν”Œλž«νΌ 선택 1개 4개 λ™μ‹œ
μ›” 생성 횟수 10회 λ¬΄μ œν•œ
νžˆμŠ€ν† λ¦¬ 보관 30일 영ꡬ
가격 무료 $9.99/μ›”

배포

Vercel 배포

  1. GitHub에 μ½”λ“œ ν‘Έμ‹œ
  2. Vercelμ—μ„œ ν”„λ‘œμ νŠΈ μž„ν¬νŠΈ
  3. ν™˜κ²½ λ³€μˆ˜ μ„€μ •
  4. 배포!

ν™˜κ²½ λ³€μˆ˜ μ„€μ • (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

ν™•μž₯ κ³„νš

Phase 1 (MVP) βœ…

  • κΈ°λ³Έ μ½˜ν…μΈ  생성
  • 4개 ν”Œλž«νΌ 지원
  • Free/Pro ꡬ뢄
  • νžˆμŠ€ν† λ¦¬ κΈ°λŠ₯

Phase 2 (개발 쀑)

  • Stripe 결제 톡합
  • μ‚¬μš©μž 인증 UI
  • ν…œν”Œλ¦Ώ μ‹œμŠ€ν…œ
  • λΈŒλžœλ“œ ν†€μ•€λ§€λ„ˆ μ„€μ •

Phase 3 (κ³„νš)

  • 더 λ§Žμ€ ν”Œλž«νΌ (LinkedIn, Twitter, TikTok)
  • AI 이미지 생성 (DALL-E, Midjourney)
  • νŒ€ ν˜‘μ—… κΈ°λŠ₯
  • μ˜ˆμ•½ λ°œν–‰
  • 뢄석 λŒ€μ‹œλ³΄λ“œ

문제 ν•΄κ²°

Claude API μ—λŸ¬

Error: Failed to generate content

ν•΄κ²°: ANTHROPIC_API_KEYκ°€ μ˜¬λ°”λ₯Έμ§€ 확인

Supabase μ—°κ²° μ‹€νŒ¨

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 start

νƒ€μž… 체크

npx tsc --noEmit

λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

Supabase SQL Editorμ—μ„œ μŠ€ν‚€λ§ˆ λ³€κ²½ 적용

κΈ°μ—¬

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

λΌμ΄μ„ μŠ€

MIT License

지원

κ°μ‚¬μ˜ 말


Made with ❀️ by [Your Name]