# 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 | `'뷰성형외과의원'` | 웹사이트 크롤링 | `
`, 메타태그, 구조화 데이터 |
| `nameEn` | string | `'VIEW Plastic Surgery'` | 웹사이트 크롤링 | 영문 페이지 또는 메타태그 |
| `established` | string | `'2005'` | 웹사이트/강남언니 | 본문 파싱 |
| `yearsInBusiness` | number | `21` | 계산 | `현재연도 - established` |
| `staffCount` | number | `28` | 강남언니/웹사이트 | 의료진 페이지 크롤링 |
| `leadDoctor.name` | string | `'최순우'` | 강남언니/웹사이트 | 대표원장 정보 |
| `leadDoctor.credentials` | string | `'서울대 출신, 의학박사'` | 웹사이트 | 의료진 프로필 파싱 |
| `leadDoctor.rating` | number | `4.7` | **강남언니 크롤링** | 의료진 평점 |
| `leadDoctor.reviewCount` | number | `1809` | **강남언니 크롤링** | 의료진 리뷰 수 |
| `overallRating` | number | `4.8` | **강남언니 크롤링** | 병원 전체 평점 |
| `totalReviews` | number | `18840` | **강남언니 크롤링** | 총 리뷰 수 |
| `priceRange` | object | `{ min: '97,900', max: '13,200,000+' }` | **강남언니 크롤링** | 시술 가격 범위 |
| `certifications` | string[] | 10개 항목 | 웹사이트 크롤링 | 인증/수상 섹션 파싱 |
| `mediaAppearances` | string[] | 3개 항목 | 웹사이트 크롤링 | 미디어 출연 섹션 |
| `medicalTourism` | string[] | 3개 항목 | 웹사이트/VisitKorea | 의료관광 관련 정보 |
| `location` | string | `'서울시 강남구...'` | 웹사이트/네이버 플레이스 | 주소 파싱 |
| `nearestStation` | string | `'9호선 신논현역...'` | 웹사이트/네이버 지도 | 교통 정보 |
| `phone` | string | `'02-539-1177'` | 웹사이트 크롤링 | `` 또는 본문 |
| `domain` | string | `'viewclinic.com'` | 사용자 입력 | URL에서 추출 |
| `logoImages.circle` | string | 이미지 경로 | **웹사이트 크롤링** | favicon, 로고 `
` 추출 |
| `logoImages.horizontal` | string | 이미지 경로 | **웹사이트 크롤링** | 헤더 로고 추출 |
| `logoImages.korean` | string | 이미지 경로 | **웹사이트 크롤링** | 한글 로고 변형 |
| `brandColors.primary` | string | `'#7B2D8E'` | **이미지 분석** | 로고 색상 추출 (Vision API / CSS 파싱) |
| `brandColors.accent` | string | `'#E8B931'` | **이미지 분석** | 로고 보조 색상 |
| `brandColors.text` | string | `'#6B2D7B'` | **CSS 파싱** | 웹사이트 텍스트 색상 |
### 2.3 채널 종합 점수 (ChannelScore[])
| 필드 | 타입 | 수집 소스 | 비고 |
|------|------|-----------|------|
| `channel` | string | 시스템 정의 | YouTube, Instagram KR, Instagram EN, Facebook, 강남언니, Website |
| `icon` | string | 시스템 정의 | lucide-react 아이콘명 |
| `score` | number (0-100) | **AI 생성** | 채널별 수집 데이터 기반 채점 |
| `maxScore` | number | 시스템 정의 | 항상 100 |
| `status` | Severity | **AI 생성** | score 기반 등급 (critical/warning/good/excellent) |
| `headline` | string | **AI 생성** | 한 줄 요약 텍스트 |
현재 Mock 데이터:
| 채널 | 점수 | 상태 | 헤드라인 |
|------|------|------|----------|
| YouTube | 65 | warning | 103K 구독자, 조회수 하락세 |
| Instagram KR | 35 | critical | 14K 팔로워, Reels 0개 |
| Instagram EN | 55 | warning | 68.8K 팔로워, 활발한 편 |
| Facebook | 40 | critical | 브랜드 불일치, 계정 분산 |
| 강남언니 | 95 | excellent | 4.8점, 18,840 리뷰 |
| Website | 50 | warning | SNS 연결 없음, 트래킹만 존재 |
### 2.4 YouTube 분석 (YouTubeAudit)
| 필드 | 타입 | 현재 Mock 값 | 수집 소스 | API 엔드포인트 |
|------|------|-------------|-----------|----------------|
| `channelName` | string | `'뷰성형외과 VIEW Plastic Surgery'` | YouTube Data API | `channels.list` → snippet.title |
| `handle` | string | `'@ViewclinicKR'` | YouTube Data API | `channels.list` → snippet.customUrl |
| `subscribers` | number | `103000` | YouTube Data API | `channels.list` → statistics.subscriberCount |
| `totalVideos` | number | `1064` | YouTube Data API | `channels.list` → statistics.videoCount |
| `totalViews` | number | `9952722` | YouTube Data API | `channels.list` → statistics.viewCount |
| `weeklyViewGrowth.absolute` | number | `67097` | **주기적 수집 후 diff** | 7일 간격 viewCount 차이 |
| `weeklyViewGrowth.percentage` | number | `4.09` | **계산** | absolute / (totalViews - absolute) * 100 |
| `estimatedMonthlyRevenue` | object | `{ min: 499, max: 1000 }` | **Social Blade API** | 또는 자체 추정 로직 (CPM 기반) |
| `avgVideoLength` | string | `'4.4분'` | YouTube Data API | `videos.list` → contentDetails.duration 평균 |
| `uploadFrequency` | string | `'~주 1회'` | **계산** | 최근 30개 영상 업로드 날짜 간격 |
| `channelCreatedDate` | string | `'2015-06-29'` | YouTube Data API | `channels.list` → snippet.publishedAt |
| `subscriberRank` | string | `'#570K'` | **Social Blade** | 전세계 구독자 순위 |
| `channelDescription` | string | (바이오 텍스트) | YouTube Data API | `channels.list` → snippet.description |
| `linkedUrls` | array | 5개 링크 | YouTube Data API | `channels.list` → brandingSettings.channel.links (v3 미지원 시 크롤링) |
| `playlists` | string[] | 9개 재생목록 | YouTube Data API | `playlists.list` → snippet.title |
| `topVideos` | TopVideo[] | 8개 영상 | YouTube Data API | `search.list` (order=viewCount) + `videos.list` |
| `diagnosis` | DiagnosisItem[] | 7개 항목 | **AI 생성** | 수집 데이터 → 패턴 분석 → 텍스트 생성 |
#### TopVideo 상세
| 필드 | 수집 소스 | API |
|------|-----------|-----|
| `title` | YouTube Data API | `videos.list` → snippet.title |
| `views` | YouTube Data API | `videos.list` → statistics.viewCount |
| `uploadedAgo` | YouTube Data API | `videos.list` → snippet.publishedAt → 상대 시간 변환 |
| `type` ('Short' / 'Long') | **계산** | duration ≤ 60초 && 세로형 → Short |
| `duration` | YouTube Data API | `videos.list` → contentDetails.duration (Long만 표시) |
### 2.5 Instagram 분석 (InstagramAudit)
| 필드 | 타입 | 수집 소스 | 수집 방법 |
|------|------|-----------|-----------|
| `accounts` | InstagramAccount[] | Instagram Graph API / Apify | 복수 계정 병렬 수집 |
| `diagnosis` | DiagnosisItem[] | **AI 생성** | 계정 간 비교 분석 |
#### InstagramAccount 상세
| 필드 | 현재 Mock (KR) | 현재 Mock (EN) | 수집 소스 |
|------|---------------|---------------|-----------|
| `handle` | `@viewplastic` | `@view_plastic_surgery` | 웹사이트 SNS 링크 → Graph API |
| `language` | `'KR'` | `'EN'` | **AI 판단** (바이오/게시물 언어 감지) |
| `label` | `'국내 (한국어)'` | `'국제 (영어)'` | language 기반 자동 라벨링 |
| `posts` | `1409` | `2524` | Graph API / Apify |
| `followers` | `14000` | `68800` | Graph API / Apify |
| `following` | `4760` | `2834` | Graph API / Apify |
| `category` | `'Health/beauty'` | `'Health/beauty'` | Graph API |
| `profileLink` | `'litt.ly/viewplasticsurgery'` | `'litt.ly/viewplasticsurgeryenglish'` | Graph API / Apify |
| `highlights` | 5개 하이라이트명 | 7개 하이라이트명 | **Apify 크롤링** (API 미지원) |
| `reelsCount` | `0` | `50` | **Apify 크롤링** |
| `contentFormat` | `'카드뉴스 100%'` | `'B/A + 환자 스토리 + Reels'` | **AI 분석** (게시물 샘플링) |
| `profilePhoto` | `'모델 사진'` | `'VIEW 골드 로고'` | Graph API / Apify |
| `bio` | (한국어 바이오) | (영어 바이오) | Graph API / Apify |
### 2.6 Facebook 분석 (FacebookAudit)
| 필드 | 타입 | 수집 소스 | 수집 방법 |
|------|------|-----------|-----------|
| `pages` | FacebookPage[] | Facebook Graph API / Apify | 복수 페이지 수집 |
| `diagnosis` | DiagnosisItem[] | **AI 생성** | 페이지 간 비교 분석 |
| `brandInconsistencies` | BrandInconsistency[] | **AI 생성** | 전 채널 크로스 비교 |
| `consolidationRecommendation` | string | **AI 생성** | 통합/폐쇄 권고 텍스트 |
#### FacebookPage 상세
| 필드 | 현재 Mock (KR) | 현재 Mock (EN) | 수집 소스 |
|------|---------------|---------------|-----------|
| `url` | `'facebook.com/viewps1'` | `'facebook.com/viewclinic'` | 웹사이트/검색 |
| `pageName` | `'뷰성형외과'` | `'View Plastic Surgery'` | Graph API |
| `followers` | `253` | `88000` | Graph API |
| `following` | `0` | `11` | Graph API |
| `category` | `'성형외과 의사'` | `'건강/뷰티'` | Graph API |
| `bio` | `'예쁨이 일상이 되는 순간!'` | `'Official Account by VIEW Partners'` | Graph API |
| `logo` | `'일치 (공식 로고)'` | `'불일치 (비공식 변형)'` | **AI 비교** (로고 이미지 대조) |
| `logoDescription` | (상세 설명) | (상세 설명) | **AI 생성** (이미지 분석) |
| `link` | `'viewclinic.com'` | `'viewplasticsurgery.com'` | Graph API |
| `linkedDomain` | `'viewclinic.com'` | `'viewplasticsurgery.com'` | Graph API → 도메인 추출 |
| `reviews` | `0` | `3` | Graph API |
| `recentPostAge` | `'1일 전'` | `'14분 전'` | Graph API → 상대시간 변환 |
| `hasWhatsApp` | `false` | `true` | Graph API |
| `postFrequency` | `'주 1~2회'` | `'일 1~2회'` | **계산** (최근 30일 게시물 수 / 30) |
| `topContentType` | `'Instagram 카드뉴스 복사'` | `'B/A + Reels'` | **AI 분석** (게시물 샘플링) |
| `engagement` | `'좋아요 0~3개'` | `'좋아요 50~300개'` | Graph API → 평균 계산 |
#### BrandInconsistency 상세
| 필드 | 설명 | 수집 소스 |
|------|------|-----------|
| `field` | 비교 항목 (로고, 연결 도메인, 바이오) | 시스템 정의 |
| `values[]` | 각 채널의 해당 필드 값 + `isCorrect` 판정 | **AI 비교** (전 채널 데이터 크로스 분석) |
| `impact` | 불일치로 인한 비즈니스 영향 | **AI 생성** |
| `recommendation` | 개선 권고사항 | **AI 생성** |
### 2.7 기타 채널 (OtherChannel[])
| 채널 | 현재 Mock 상태 | 수집 소스 | 수집 방법 |
|------|--------------|-----------|-----------|
| 카카오톡 | active | 카카오 채널 검색 API | 채널 URL 유효성 확인 |
| 네이버 블로그 | unknown | Naver Search API | `blog.naver.com/{id}` 검색 |
| 네이버 플레이스 | unknown | Naver Place API / 크롤링 | 병원명 검색 |
| TikTok | not_found | TikTok API / Apify | 핸들 검색 |
| 강남언니 | active | **강남언니 크롤링** | Apify 또는 직접 크롤링 |
| 모두닥 | active | **크롤링** | 병원명 검색 |
| Goodoc | active | **크롤링** | 병원명 검색 |
| 닥터나우 | active | **크롤링** | 병원명 검색 |
### 2.8 웹사이트 분석 (WebsiteAudit)
| 필드 | 현재 Mock 값 | 수집 소스 | 수집 방법 |
|------|-------------|-----------|-----------|
| `primaryDomain` | `'viewclinic.com'` | 사용자 입력 | URL에서 추출 |
| `additionalDomains` | 3개 추가 도메인 | **DNS/리다이렉트 추적** | WHOIS + 크롤링 중 발견되는 도메인 |
| `snsLinksOnSite` | `false` | **웹사이트 크롤링** | `` 태그에서 SNS 도메인 검색 |
| `trackingPixels[].name` | FB Pixel, Kakao Pixel, GTM | **HTML 파싱** | `