diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..60900b9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,58 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +INFINITH Demo — AI 마케팅 분석 플랫폼의 프론트엔드 데모. 성형외과(뷰성형외과)를 대상으로 YouTube/Instagram/Facebook/웹사이트를 분석하고, 변환 전략/로드맵/KPI를 제안하는 마케팅 리포트를 보여준다. 현재는 mock 데이터 기반이며 실제 API 연동은 미구현 상태. + +## Commands + +- `npm run dev` — 개발 서버 (port 3000) +- `npm run build` — 프로덕션 빌드 +- `npm run lint` — TypeScript 타입 체크 (`tsc --noEmit`) +- 테스트 프레임워크 없음 + +## Architecture + +**Stack:** React 19 + TypeScript + Vite 6 + Tailwind CSS 4 + React Router 7 + +**Routes** (`src/main.tsx`): +- `/` — 랜딩 페이지 +- `/report/loading` — 분석 로딩 (Navbar/Footer 숨김) +- `/report/:id` — 마케팅 분석 리포트 +- `/plan/:id` — 마케팅 플랜 +- `/studio/:id` — 콘텐츠 스튜디오 (AI 이미지 생성) +- `/channels` — 채널 연결 +- `/distribute` — 콘텐츠 배포 +- `/performance` — 성과 분석 + +**Data flow:** +1. Pages → custom hooks (`useReport`, `useMarketingPlan`) → mock data (`src/data/`) +2. Hooks return `{ data, isLoading, error }` 패턴 (100ms delay로 API 시뮬레이션) +3. `ScreenshotContext`로 리포트 스크린샷 데이터 공유 +4. `useExportPDF` 훅으로 리포트 → PDF 변환 + +**Type definitions** in `src/types/`: +- `report.ts` — `MarketingReport` 및 하위 타입 (YouTubeAudit, InstagramAudit, etc.) +- `plan.ts` — 마케팅 플랜 타입 +- `studio.ts` — 콘텐츠 스튜디오 타입 + +**AI Integration:** `src/services/geminiImageGen.ts` — Gemini 2.5 Flash로 이미지 생성. `GEMINI_API_KEY` 환경변수 필요. + +## Styling + +- Tailwind CSS 4 (`@theme` directive in `src/index.css`) +- 폰트: Pretendard (sans), Playfair Display (serif/headings) +- 색상: `primary-900` (#0A1128), `accent` (#6C5CE7) +- 상태 색상: `status-critical`, `status-warning`, `status-good`, `status-info` (각각 bg/text/border/dot 변형) +- `glass-card` 클래스: 반투명 글래스모피즘 카드 +- 애니메이션: Motion (framer-motion 후속) 사용 + +## Path Alias + +`@/` → 프로젝트 루트 (tsconfig.json + vite.config.ts 모두 설정됨) + +## Deployment + +Vercel (SPA 모드 — 모든 경로 `/index.html`로 리라이트) diff --git a/docs/clinic-profile-platform.md b/docs/clinic-profile-platform.md new file mode 100644 index 0000000..6e2da2e --- /dev/null +++ b/docs/clinic-profile-platform.md @@ -0,0 +1,287 @@ +# INFINITH — 병원 통합 프로필 플랫폼 기획서 +**Version:** 1.0 | **Updated:** 2026-03-30 | **Status:** 컨셉 검증 (데모 구현 완료) + +--- + +## 1. 개요 + +### 1.1 한 줄 요약 + +> 여러 플랫폼에 흩어진 병원 정보를 한 곳에 모아 보여주는 **"병원판 김박사넷"** + +### 1.2 문제 정의 + +환자가 성형외과 하나를 알아보려면: +- **강남언니**에서 리뷰/가격 확인 +- **네이버 플레이스**에서 위치/진료시간 확인 +- **YouTube**에서 원장 영상 검색 +- **Instagram**에서 전후 사진 확인 +- **병원 홈페이지**에서 의료진 정보 확인 +- **구글**에서 해외 리뷰 확인 + +→ 최소 **5~6개 플랫폼**을 오가며 직접 정보를 모아야 함 + +### 1.3 솔루션 + +**김박사넷이 교수 정보를 각 대학 사이트에서 모아 통합 프로필을 제공하듯, +INFINITH가 병원/의사 정보를 각 플랫폼에서 모아 통합 프로필을 제공한다.** + +핵심: **실시간성이 필요 없는 정적 데이터**만 수집하여 운영 비용 최소화 + +--- + +## 2. 레퍼런스 모델 + +### 2.1 김박사넷 (kimbaksa.net) + +| 항목 | 내용 | +|------|------| +| 서비스 | 대학 교수 통합 프로필 검색 | +| 데이터 | 교수 이름, 학력, 논문, 연구분야, 연구실 | +| 수집 소스 | 각 대학 홈페이지, 학술 DB | +| 업데이트 주기 | 비정기 (교수 정보는 거의 안 바뀜) | +| 핵심 가치 | 흩어진 정보를 한 곳에서 비교/검색 | + +### 2.2 호텔스컴바인 / 아고다 + +| 항목 | 내용 | +|------|------| +| 서비스 | 여러 OTA의 호텔 가격을 한 곳에서 비교 | +| 데이터 | 호텔 기본 정보 + 각 OTA별 가격 | +| 핵심 가치 | 직접 비교하지 않아도 최저가를 찾아줌 | + +### 2.3 INFINITH 병원 프로필 = 김박사넷 + 호텔스컴바인 + +| 김박사넷처럼 | 호텔스컴바인처럼 | +|-------------|---------------| +| 의사 학력/경력/전문분야 통합 | 플랫폼별 평점/리뷰 비교 | +| 병원 인증/수상 이력 정리 | 시술별 가격 비교 | +| 한 곳에서 전체 프로필 확인 | 여러 소스의 데이터 집계 | + +--- + +## 3. 데이터 전략 + +### 3.1 핵심 원칙: 정적 데이터만 수집 + +| 변경 주기 | 데이터 유형 | 예시 | 수집 빈도 | +|----------|-----------|------|-----------| +| **거의 불변** | 의사 기본 정보 | 이름, 학력, 자격, 경력 | 최초 1회 + 연 1회 검증 | +| **거의 불변** | 병원 시설 정보 | 위치, 장비, 인증, 수상 | 최초 1회 + 연 1~2회 | +| **분기 1회** | 시술/가격 | 시술 목록, 시작 가격 | 분기 1회 배치 | +| **월 1회** | 집계 평점 | 강남언니/네이버/구글 평점 | 월 1회 배치 | +| **월 1회** | 채널 존재 여부 | YouTube/Instagram 링크, 팔로워 규모 | 월 1회 | + +### 3.2 B2B와 데이터 분리 + +``` +수집된 전체 데이터 + │ + ├── B2C 공개 (병원 통합 프로필) ───────────── + │ · 의사 학력/경력/전문분야 + │ · 병원 시설/인증/위치/진료시간 + │ · 시술 목록 + 가격대 + │ · 플랫폼별 집계 평점 (강남언니/네이버/구글) + │ · YouTube/Instagram 채널 링크 + 팔로워 규모 + │ · 언론 보도 / 미디어 출연 이력 + │ + └── B2B 전용 (마케팅 인텔리전스) ──────────── + · 채널별 상세 진단 (점수, 문제점) + · 브랜드 일관성 분석 (로고/바이오 불일치) + · 콘텐츠 성과 분석 (조회수 추이, 참여율) + · 경쟁사 비교 분석 + · 변환 전략 / 로드맵 / KPI +``` + +**B2C는 "이 병원이 어떤 곳인지"** → 환자용 정보 +**B2B는 "이 병원의 마케팅이 어떤 상태인지"** → 병원/대행사용 인텔리전스 + +### 3.3 수집 소스 및 방법 + +| 소스 | 수집 대상 | 도구 | 비용 | +|------|----------|------|------| +| 병원 홈페이지 | 의료진, 시설, 인증, 연락처 | Firecrawl | ~₩26,000/월 | +| 강남언니 | 평점, 리뷰 수, 가격, 의료진 상세 | Firecrawl | 포함 | +| 네이버 플레이스 | 평점, 리뷰 수, 위치, 진료시간 | Naver API | 무료 | +| Google Maps | 평점, 리뷰 수 | Google Places API | 사용량 기반 | +| YouTube | 채널 존재, 구독자 수, 영상 수 | YouTube Data API | 무료 | +| Instagram | 계정 존재, 팔로워 수 | Apify | ~₩65,000/월 | + +### 3.4 크롤링 비용 시뮬레이션 + +| 병원 수 | 수집 빈도 | 월간 Firecrawl 크레딧 | 예상 비용 | +|---------|----------|---------------------|-----------| +| 100개 | 월 1회 전체 | ~500 credits | Growth 플랜 내 | +| 500개 | 월 1회 전체 | ~2,500 credits | ~₩50,000 | +| 1,000개 | 월 1회 전체 | ~5,000 credits | ~₩100,000 | + +**정적 데이터이므로 최초 수집 후에는 변경 감지 수집만 하면 비용 대폭 절감** + +--- + +## 4. 프로필 페이지 구성 + +### 4.1 데모 페이지 + +- **경로:** `/clinic/:id` (예: `/clinic/view-clinic`) +- **파일:** `src/pages/ClinicProfilePage.tsx` +- **데이터:** Firecrawl + WebFetch로 실제 수집한 뷰성형외과 데이터 + +### 4.2 섹션 구조 + +| 순서 | 섹션 | 포함 데이터 | 데이터 출처 | +|------|------|-----------|------------| +| 1 | **헤더** | 병원명, 개원연도, 핵심 지표 3개 | 웹사이트 + 강남언니 | +| 2 | **기본 정보** | 주소, 최근역, 전화, 진료시간, 웹사이트 | 웹사이트 + 네이버 플레이스 | +| 3 | **통합 평점** | 강남언니/네이버/구글 평점 + 리뷰 수 비교 | 3개 플랫폼 집계 | +| 4 | **의료진** | 의사별 카드 (이름, 전문분야, 학력, 평점, 리뷰 수) | 강남언니 + 웹사이트 | +| 5 | **시술/가격** | 시술 목록 + 카테고리 + 시작 가격 | 강남언니 | +| 6 | **인증/수상** | 인증 뱃지 + 미디어 출연 이력 | 웹사이트 + 강남언니 | +| 7 | **온라인 채널** | YouTube/Instagram/Facebook/카카오톡 링크 + 팔로워 | Firecrawl + YouTube API | +| 8 | **데이터 출처 고지** | 출처 명시, 업데이트일, 수정 요청 안내 | - | + +### 4.3 향후 추가 예정 섹션 + +| 섹션 | 내용 | 우선순위 | +|------|------|----------| +| 리뷰 요약 | 각 플랫폼 리뷰를 AI가 요약 | P1 | +| 전후 사진 갤러리 | Instagram/강남언니 전후 사진 집계 | P1 | +| 비슷한 병원 | 같은 지역 + 유사 시술 병원 추천 | P2 | +| 가격 비교 | 동일 시술의 타 병원 가격 비교 | P2 | +| 의사 상세 페이지 | 의사별 독립 프로필 (논문, 경력 상세) | P2 | + +--- + +## 5. 사업 모델 + +### 5.1 수익 구조 (듀얼 모델) + +``` +┌─────────────────────────────────────────────────────┐ +│ B2C: 병원 통합 프로필 플랫폼 │ +│ │ +│ 무료 서비스 (트래픽 확보) │ +│ └→ 수익화: │ +│ · 프리미엄 리스팅 (병원이 프로필 상단 노출 비용) │ +│ · 상담 연결 수수료 (CPA) │ +│ · 광고 (배너, 네이티브 광고) │ +│ · 프리미엄 뱃지 (병원 인증 마크) │ +└─────────────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────────────┐ +│ B2B: 마케팅 인텔리전스 SaaS │ +│ │ +│ 유료 서비스 (직접 매출) │ +│ └→ 수익화: │ +│ · 마케팅 분석 리포트 (건당 50~100만원) │ +│ · 월정액 모니터링 SaaS (월 30~100만원) │ +│ · 마케팅 대행 영업 도구 (대행사 라이선스) │ +└─────────────────────────────────────────────────────┘ +``` + +### 5.2 시너지 + +| B2C에서 B2B로 | B2B에서 B2C로 | +|-------------|-------------| +| 트래픽 데이터로 병원에 "환자들이 당신을 이렇게 봅니다" 어필 → B2B 세일즈 | B2B 수집 데이터가 B2C 프로필의 품질 향상 | +| 상담 연결 데이터로 마케팅 ROI 증명 → B2B 가치 입증 | B2B 고객 병원에 프리미엄 프로필 제공 → B2C 콘텐츠 풍부 | + +--- + +## 6. 경쟁 분석 + +### 6.1 기존 플레이어와의 차이 + +| | 강남언니 | 모두닥 | 바비톡 | **INFINITH** | +|---|---------|-------|-------|-------------| +| **포지셔닝** | 리뷰 플랫폼 | 예약 플랫폼 | 커뮤니티 | **메타 검색 (통합 비교)** | +| **데이터** | 자체 리뷰만 | 자체 리뷰만 | 자체 리뷰만 | **전 플랫폼 집계** | +| **의사 정보** | 평점 + 리뷰 수 | 기본 정보 | 기본 정보 | **학력/경력 + 전 플랫폼 평점** | +| **가격** | 자체 등록 | 자체 등록 | 없음 | **플랫폼 간 비교** | +| **영상 콘텐츠** | 없음 | 없음 | 없음 | **YouTube 연동** | +| **경쟁 관계** | 직접 경쟁 | 직접 경쟁 | 직접 경쟁 | **보완 관계 (메타 레이어)** | + +### 6.2 핵심 차별점 + +1. **메타 플랫폼** — 강남언니/모두닥/네이버와 경쟁하는 게 아니라 그들의 데이터를 모아주는 상위 레이어 +2. **의사 중심 프로필** — 김박사넷처럼 "이 의사의 모든 정보를 한 곳에서" (병원이 아닌 의사 단위 검색) +3. **영상 콘텐츠 연동** — 기존 플랫폼이 제공하지 않는 YouTube/Instagram 콘텐츠까지 통합 +4. **B2B 시너지** — 수집 인프라를 B2C/B2B 양쪽에 활용하는 듀얼 모델 + +--- + +## 7. 리스크 및 대응 + +### 7.1 법적 리스크 + +| 리스크 | 심각도 | 대응 | +|--------|--------|------| +| 타 플랫폼 크롤링 → 이용약관 위반 가능 | 중 | 공개 정보만 수집, robots.txt 준수, 출처 명시 | +| 가격 정보 노출 → 의료광고법 | 중 | "시작 가격"만 표시, "상담 후 결정" 고지 | +| 의사 개인정보 → 초상권/프라이버시 | 낮 | 공개된 프로필 정보만 사용, 삭제 요청 즉시 대응 | + +### 7.2 사업 리스크 + +| 리스크 | 대응 | +|--------|------| +| 강남언니 등이 크롤링 차단 | Apify 등 우회 수단 + 사용자 기여 데이터로 전환 | +| 초기 트래픽 확보 어려움 | SEO 최적화 (병원명 + 의사명 검색), B2B 병원에 프로필 링크 제공 | +| 데이터 신선도 유지 비용 | 정적 데이터 위주로 수집 빈도 최소화 (핵심 전략) | + +--- + +## 8. 로드맵 + +### Phase 1 (MVP) — 현재 + +- [x] 뷰성형외과 단일 프로필 데모 페이지 +- [x] Firecrawl 데이터 수집 검증 +- [x] 데이터셋 정의 완료 + +### Phase 2 — 강남 성형외과 100개 + +- [ ] 강남 주요 성형외과 100개 프로필 자동 생성 +- [ ] 병원 검색/필터 기능 (지역, 시술, 가격대) +- [ ] 의사별 독립 프로필 페이지 +- [ ] SEO 최적화 (병원명/의사명 검색 노출) + +### Phase 3 — 플랫폼 확장 + +- [ ] 사용자 리뷰 집계 (강남언니 + 네이버 + 구글 통합 요약) +- [ ] 가격 비교 기능 (동일 시술 타 병원 비교) +- [ ] 병원 클레임 (병원이 직접 프로필 관리) +- [ ] B2B 연동 (프로필에서 마케팅 분석 리포트 CTA) + +### Phase 4 — 수익화 + +- [ ] 프리미엄 리스팅 (병원 과금) +- [ ] 상담 연결 CPA +- [ ] B2B SaaS 정식 런칭 + +--- + +## 9. 기술 구현 현황 + +### 9.1 데모 페이지 + +| 항목 | 값 | +|------|-----| +| 경로 | `/clinic/:id` | +| 파일 | `src/pages/ClinicProfilePage.tsx` | +| 데이터 | 컴포넌트 내 하드코딩 (실제 수집 값 기반) | +| 디자인 | 프로젝트 기존 디자인 시스템 (glass-card, Motion 애니메이션) | + +### 9.2 실제 구현 시 필요 작업 + +| 작업 | 설명 | 우선순위 | +|------|------|----------| +| 병원 데이터 DB 스키마 | Supabase PostgreSQL | P0 | +| 크롤링 배치 파이프라인 | Firecrawl + YouTube API + Apify | P0 | +| 병원 목록 페이지 | 검색/필터 UI | P0 | +| 동적 프로필 페이지 | DB에서 데이터 로드 → 렌더링 | P0 | +| SEO (SSR/SSG) | Next.js 또는 Astro 전환 검토 | P1 | +| 의사 상세 페이지 | 의사별 독립 URL | P1 | + +--- + +*Last updated: 2026-03-30* diff --git a/docs/datasets.md b/docs/datasets.md new file mode 100644 index 0000000..50a1b0b --- /dev/null +++ b/docs/datasets.md @@ -0,0 +1,813 @@ +# INFINITH — 데이터셋 정의서 +**Version:** 1.0 | **Updated:** 2026-03-30 | **Status:** Mock → Real 전환 설계 + +현재 프론트엔드 데모에서 사용 중인 모든 데이터를 정리하고, 실제 서비스 구현 시 각 데이터의 **수집 소스**, **수집 방법**, **우선순위**를 명시한다. + +--- + +## 목차 + +1. [데이터 흐름 개요](#1-데이터-흐름-개요) +2. [Report 데이터 (MarketingReport)](#2-report-데이터-marketingreport) +3. [Plan 데이터 (MarketingPlan)](#3-plan-데이터-marketingplan) +4. [Studio 데이터 (Content Studio)](#4-studio-데이터-content-studio) +5. [수집 소스별 분류](#5-수집-소스별-분류) +6. [AI 생성 데이터](#6-ai-생성-데이터) +7. [데이터 의존 관계](#7-데이터-의존-관계) +8. [Firecrawl 수집 검증 결과](#8-firecrawl-수집-검증-결과) + +--- + +## 1. 데이터 흐름 개요 + +``` +사용자 입력 (URL) + ↓ +┌─────────────────────────────────────────────┐ +│ Phase A: 데이터 수집 (Crawl + API) │ +│ 웹사이트 → YouTube → Instagram → Facebook │ +│ → 강남언니 → 네이버 → 기타 플랫폼 │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Phase B: AI 분석 (LLM) │ +│ 채점 → 진단 → 전략 수립 → 로드맵 → KPI │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Phase C: 산출물 렌더링 │ +│ Report → Plan → Studio → Distribution │ +└─────────────────────────────────────────────┘ +``` + +**현재 상태:** Phase A~B가 모두 `src/data/mockReport.ts`, `src/data/mockPlan.ts`에 하드코딩되어 있음. + +--- + +## 2. Report 데이터 (MarketingReport) + +> 타입 정의: `src/types/report.ts` +> Mock 데이터: `src/data/mockReport.ts` +> 사용 페이지: `/report/:id` (`src/pages/ReportPage.tsx`) + +### 2.1 기본 메타 정보 + +| 필드 | 타입 | 현재 Mock 값 | 수집 소스 | 수집 방법 | +|------|------|-------------|-----------|-----------| +| `id` | string | `'view-clinic'` | 시스템 생성 | UUID / slug | +| `createdAt` | string | `'2026-03-22'` | 시스템 생성 | 리포트 생성 시점 | +| `targetUrl` | string | `'https://www.viewclinic.com'` | **사용자 입력** | 분석 시작점 | +| `overallScore` | number | `62` | **AI 생성** | 채널 점수 가중 평균 | + +### 2.2 의원 현황 (ClinicSnapshot) + +| 필드 | 타입 | 현재 Mock 값 | 수집 소스 | 수집 방법 | +|------|------|-------------|-----------|-----------| +| `name` | string | `'뷰성형외과의원'` | 웹사이트 크롤링 | `