MEDCODE 전체 현황 4개 서비스 + 1 외부
서비스 수
4
+ BRITZMEDI (외부 레포)
소스 파일
437
.ts + .tsx + .astro 합계
크롤링 완료
49 / 2,700
병원 수집률 1.8%
위반 패턴
161
32개 카테고리 / 100% 정확도
DB 마이그레이션
55
sales 28 + check 27
월 운영비
$25
Contabo $10.75 + AI ~$15

시스템 아키텍처 & 데이터 흐름

┌──────────────────────┐ │ hospitals 마스터 DB │ │ 12,530 병원 레코드 │ └──────────┬───────────┘┌────────────────┴─────────────────┐ │ MADMEDSCV (Layer 1) │ │ Firecrawl → Playwright → Gemini │ │ scv_crawl_snapshots / pages │ │ scv_site_profiles │ └────────┬────────────────┬─────────┘ │ │ ┌────────────┴───┐ ┌────┴───────────────┐ │ MADMEDSALES │ │ MADMEDCHECK │ │ (Layer 2-A) │ │ (Layer 2-B) │ │ sales_* 테이블 │ │ check_* / D1 테이블 │ │ │ │ │ │ web / admin │ │ service / dashboard │ │ engine (Hono) │ │ engine (Hono) │ └─────────────────┘ └─────────────────────┘ │ │ ┌────────────┴────────────────┴──────┐ │ MADMEDVALIDATE (Helper) │ │ 4-Layer 검증 / A+B 91% / PASS 판정 │ └─────────────────────────────────────┘
서비스별 요약

MADMEDSCV

분리 진행
Layer 1 — 공용 크롤링 + OCR 엔진
병원 웹사이트 크롤링 → 스크린샷 → Gemini OCR 텍스트 추출. 도메인별 자동 전략 선택.
24 소스파일4,532 LOCNode.js + TS
Step 1-2 / 440%

MADMEDSALES

v5.7+
Layer 2-A — 병원 영업 자동화 플랫폼
AI 병원 분석 → 제품 매치 스코어링 → 자동 리드 생성 → 이메일/카카오 시퀀스 → CRM.
382 파일3 apps + scriptsAstro + React + Hono
49 / 2,700 병원35%

MADMEDCHECK

Phase 2
Layer 2-B — 의료 광고 적법성 분석
의료법 56조 기반 161개 위반 패턴 매칭. 가격 모니터링. 자동 개선 시스템. 3-서비스 분리.
202+ 파일19 탭 / 43 APIReact + Hono + D1
Phase 2 / 555%

MADMEDVALIDATE

PASS
Helper — 데이터 품질 검증 (2-Layer)
스키마/범위/교차/추적 검증. 8개 오류 분류. 33병원 검증 A+B 91% → 2,700 확장 가능 판정.
15 파일1,338 LOCNode.js + TS
검증 완료 / PASS 판정90%
작업 우선순위 로드맵
1

medcheck-service 유저 흐름 완결

고객 포털: 가입 → 무료 분석 → TossPayments 결제 → 리포트. Auth v2 + 6개 대시보드 탭.

진행 중
2

medcheck-dashboard 유저 관리 + 미완성 탭

Auth v2 RBAC 기반 유저 관리. HITL 큐, 성능 추적, 자동 학습 19개 탭 완성.

Phase 1 완료
3

madmedsales 가격 수집 → API 전환

시술 가격 데이터를 medcheck-engine이 수집. madmedsales는 API 소비만.

대기
4

madmedscv 독립 분리 완료 (Step 3-4)

madmedsales 연동 → 스케줄 관리. 2,700 병원 대규모 크롤링 준비.

Step 1-2 완료
5

2,700 병원 대규모 크롤링

S/A/B 등급별 배치 스케줄링. 예상 소요: 248시간 (20.7일 × 12h/day).

대기
인프라 & 비용
Supabase PostgreSQL
프로젝트madmedsales (ap-southeast-2)
테이블 수60+
마이그레이션28 SQL 파일 / 1,798줄
비용Free Tier
Cloudflare
Workers2 (sales + check engine)
Pages4 사이트 배포
D1 (SQLite)medcheck 분석 캐시
비용Free Tier
Contabo VPS + AI
Firecrawl 셀프호스팅Tokyo / $10.75/mo
Gemini 2.5 FlashOCR + 분석 / ~$8/mo
Claude API스코어링 / ~$7/mo
총 월 비용~$25
핵심 이슈 (전체)
  • 가격 추출 0% — madmedsales 이벤트 가격 파싱 실패. medcheck-engine으로 전환 필요.
  • 이미지 사이트 커버리지 34-39% — 목표 50%+. OCR 배치 최적화 추가 필요.
  • 장비 사전 미완성 — 262/400+ 항목. v1.4.1 매칭률 86.7%.
  • madmedsales.com 도메인 미구매 — 서비스 런칭 전 확보 필요.
  • AI 하이브리드 분석 미벤치마크 — medcheck 패턴만 100% 검증.
  • Auth v2 Phase 2-4 미완성 — 폰인증, OCR, NTS, 초대/리워드, 조직 과금.
MADMEDSCV Layer 1 — 크롤링 + OCR 공용 엔진
소스 파일
24
src/ 전체
코드 라인
4,532
TypeScript
병원당 처리
5.5
10분→5.5분 (45% 개선)
성공률
85%
39/46 PASS
전체 스케일
20.7
2,700 병원 (12h/day)

크롤링 파이프라인 (6단계)

Step 0 Site Profile 로드 → buildStrategy() (first_crawl / from_profile) │ Step 1 collectUrls() ── Fallback Chain: │ ① mapUrl (Firecrawl /map, limit:100, retry:2) │ ② DOM Link 추출 (Playwright <a href>) │ ③ Markdown Link 추출 (메인페이지 재활용) │ → filterRelevantUrls() + prioritizeUrls()Step 2 scrapePageWithActions() × 3 병렬 │ ① Actions Scrape (scroll 4회 + screenshot) │ ② Basic Scrape (fallback) │ ③ Hash 중복 감지 (SPA 탐지) │ ④ Playwright Rescue (<200자 시 JS 렌더링) │ Step 3 captureScreenshots() — Playwright │ viewportWidth:1280, maxScreenshots:50 │ 팝업 닫기 (10개 셀렉터) → 스크롤 캡처 → sharp 최적화 │ Step 4 extractTextFromImageBatch() — Gemini 2.5 Flash │ 4장씩 배치 / temperature:0.1 / maxOutputTokens:65536 │ delay:4500ms / timeout:90s │ Step 5 DB 저장 → scv_crawl_snapshots + scv_crawl_pages (content_hash) │ Step 6 upsertSiteProfile() → 관찰 데이터 프로필 업데이트 │ + MedCheck Engine 자동 트리거 (POST /v1/analyze-from-scv)
소스 파일 구조 & LOC
Core Modules
src/index.ts764줄CLI 진입점, 4 모드 (single/batch/enrich/scheduled)
src/crawl/firecrawl.ts412줄Firecrawl API, URL 수집, 페이지 스크래핑
src/ocr/screenshot.ts344줄Playwright 브라우저, 스크린샷, 팝업 처리
src/ocr/gemini-ocr.ts279줄Gemini API OCR (API Key + Service Account JWT)
src/crawl/strategy.ts254줄사이트 분류, 적응형 전략 빌드
src/extract/doctor-extractor.ts241줄의사 정보 구조화 추출
src/db/entity-dictionary.ts241줄엔티티 사전 / KOL 필드 매핑
Support Modules
src/crawl/playwright-crawler.ts162줄SPA 폴백 크롤러
src/db/schedule.ts147줄크롤링 스케줄 관리
src/search/enrich.ts122줄URL 발견 (Google + Naver)
src/crawl/smart-sort.ts112줄URL 필터링 + 페이지 분류
src/utils/checkpoint.ts89줄배치 체크포인트 (--resume)
src/utils/logger.ts86줄파일/콘솔 로깅 (UTF-8)
src/crawl/page-filter.ts85줄콘텐츠 정리, 중복 제거
+ 10개 유틸리티 파일~600줄retry, hash, json-repair 등
Site Crawl Strategy 시스템
SiteType 분류 (7종)
static HTML 정적 사이트
spa_light 경량 SPA (약간의 JS)
spa_heavy 중량 SPA (networkidle 실패)
iframe_site iframe 기반 콘텐츠
fully_dynamic Firecrawl 완전 실패
blocked 크롤링 차단됨
unknown 첫 크롤링 전
CrawlStrategy 설정값
skipFirecrawlfully_dynamic 시 true
alwaysPlaywrightText50%+ PW 텍스트 시
expectPopupspopup_count > 0
extraSpaWaitMs0 / 1500 / 3000
urlCollectionOrdermapUrl → DOM → MD
DB 테이블 (scv_* prefix)
scv_crawl_snapshots병원별 스냅샷
scv_crawl_pages개별 페이지 데이터
scv_site_profiles도메인 전략 프로필
scv_crawl_validations크롤링 검증 기록
분리 작업 진행
Step 1: 코드 복사
recrawl-v5.ts → madmedscv/src/ 분리. 24개 파일 독립.
Step 2: 독립 테스트
madmedscv 단독 실행 검증. single / batch / scheduled 3모드.
Step 3: madmedsales 연동
madmedsales가 scv_crawl_pages 읽기로 전환. 기존 scripts/ 코드 제거.
Step 4: 스케줄 관리
next_crawl_at 기반 자동 재크롤. 서비스별 빈도 분리.
성능 벤치마크 (2026-02-27)

처리 시간 분포

분석 방법 비율

성공/실패 분포

이슈
  • 이미지 사이트 커버리지 34-39% — 동안중심의원 등 이미지 중심 병원 데이터 부족. 목표 50%+.
  • /clinicInfoPrima/ 필터 — Prima Clinic 특화. 범용 적용 검증 필요.
  • page_type 오분류 — hairRemoval/lesion → event 잘못 분류 사례.
  • Gemini rate limit — delay 4500ms. 더 공격적 배치 시 429 위험.
MADMEDSALES v5.7+ — 영업 자동화 플랫폼
크롤링 완료
49
/ 2,700 (1.8%)
성공률
85%
39 PASS / 6 INSUF / 1 REV
평균 커버리지
93%
데이터 추출 비율
가격 추출
0%
미구현
장비 사전
262
v1.4.1 / 86.7% 매칭
DB 마이그레이션
28
1,798 SQL 줄
모노레포 구조 & 파일 수
apps/web — 고객 포털
madmedsales.com
파일 수7
스택Astro 5 + React 19
페이지index, product, demo, evaluate, unsubscribe
도메인 미구매
apps/admin — CRM 대시보드
admin.madmedsales.com
파일 수67
컴포넌트47개
커스텀 Hooks10개
운영 중
apps/engine — API 서버
api.madmedsales.com
파일 수52
API 라우트17 + CRM 5
스코어링 서비스11개 파일
Cloudflare Workers
Admin 컴포넌트 상세 (47개)
Dashboard (12)
KpiCardsPipelineSummary
EmailStatsRecentActivity
PipelineFunnelMonthlyCostCard
GradeDistributionChartDataCollectionChart
DataKpiCardsMatchDetailTable
CrawlHistoryTableRecentActivityFeed
CRM (13)
CrmDashboardCrmHospitalFilters
CrmHospitalListCrmHospitalDetail
CrmHospitalInfoTabCrmHospitalEquipmentTab
CrmHospitalContactsTabCrmHospitalForm
CrmProductList...
기타 (Lead 4 + Email 3 + Hospital 7 + ...)
LeadFilters / List / DetailLeadTimeline
HospitalList / DetailHospitalDataTab
HospitalAnalysisTabProfiledHospitalTab
EmailList / EmailStatsDemoList / DemoDetail
Cost 4개 (Summary, Gauge, Daily, Breakdown)PipelineBoard
API 라우트 (22 엔드포인트)
경로기능Phase
/api/hospitals병원 마스터 CRUDP1
/api/scoring매치 스코어 계산P2
/api/emails이메일 발송 & 추적 (Resend)P3
/api/sequences이메일 시퀀스 자동화P3
/api/webhooksWebhook 핸들러 (이메일 이벤트)P4
/api/kakao카카오톡 비즈 메시지P4
/api/demos데모 스케줄링P5
/api/public비인증 퍼블릭 APIP5
/api/reports리포트 생성 (DOCX)P5
/api/costsAI API 비용 추적Infra
/api/networks네트워크/프랜차이즈 검증Infra
/api/crm/*CRM 5개 서브라우트 (hospitals, contacts, equipment, products, franchises)CRM
2단계 스코어링 시스템
Stage 1: Hospital Profiler (제품 무관)
Medical (장비·의사·시술)25%
Marketing (이벤트·온라인)25%
Location (지리·접근성)25%
Reputation (리뷰·평판)25%
파일: scoring/profiler.ts + marketing-scorer.ts
Stage 2: Product Matcher (제품별)
Equipment (보유 장비 매칭)동적 가중치
Procedure (시술 메뉴 매칭)동적 가중치
Price (가격대 적합성)0% (미구현)
Volume (고객 수요)동적 가중치
Readiness (도입 의향)동적 가중치
파일: scoring/matcher.ts + scoring_criteria DB 테이블

병원 데이터 수집량 (49개 샘플)

크롤링 진행률

장비 사전 (v1.4.1)
RF
~40
써마지, 인모드, 올리지오, 포텐자, 토르RF
HIFU
~20
울쎄라, 슈링크, 온다리프팅
Booster
~25
쥬베룩, 리쥬란
기타 5 카테고리
~177
Surgery, Lifting, Body, Toxin, Filler
Scripts 현황 (256 파일)
카테고리파일 수주요 파일
V5 서브시스템12contact, doctor-modal, merge-dedup, torr-detector, site-fingerprint (3,541줄)
크롤러13crawl-hira, crawl-naver, crawl-web, geocode, firecrawl-analyze
리포트 생성7generate-reports v1/v2, doctor-data-report (DOCX 출력)
데이터 처리18normalize-address/area, import-hospitals, sync-equipment
스코어링 테스트6test-scoring v2/v31, v57-sales-scoring
업로드/파이프라인6upload-to-db, run-batch-pipeline, step1~4
테스트/디버그40+_test-*, _debug-*, _check-*, _clear-*
이슈
  • 가격 추출 0% — 이벤트 가격 파싱 미구현. medcheck-engine API 전환 대기.
  • 장비 사전 262/400+ — 매칭률 86.7%. 크롤링 확대 시 보강 필요.
  • 데이터 중복 리스크 — 세인트의원 장비 123개 / 시술 354개 (5-7× 평균).
  • 도메인 미구매 — madmedsales.com 미확보.
  • 시술 매핑 86.7% — 75개 중 11개 미매핑. 추가 규칙 필요.
MADMEDCHECK Phase 2 — 3-서비스 분리 아키텍처
위반 패턴
161
32개 카테고리
정확도
100%
23 테스트 / FP 0 / FN 0
대시보드 탭
19
UI 컴포넌트 38개
API 라우트
43
엔진 엔드포인트
D1 마이그레이션
27
30+ 테이블
엔진 파일
114
TypeScript
3-서비스 아키텍처
medcheck-service (고객 SaaS)
madmedcheck.com
스택Astro 5 + React 19
소스 파일50+
Auth 컴포넌트8개
대시보드 뷰9개
결제TossPayments SDK v2
유저 흐름 구현 중
medcheck-dashboard (관리자)
dashboard.madmedcheck.com
스택React 19 + Vite 7
탭 컴포넌트19개
UI 컴포넌트11개
차트Recharts 3.7
폴링5초 실시간
UI 완성
medcheck-engine (분석 엔진)
api.madmedcheck.com
스택Hono v4 + CF Workers
라우트 파일43개
코어 모듈violation-detector, ai-analyzer, price-saver 등
DBD1 (SQLite) + Supabase
Phase 2 진행
대시보드 19개 탭 상세
#탭 ID컴포넌트기능상태
1overviewOverviewTab전체 통계, 가격, 알림완료
2violationsViolationsTab위반 탐지 결과완료
3analyzeAnalyzeTab텍스트 분석 (AI 옵션)완료
4hospitalsHospitalsTab병원 데이터 관리완료
5reportsReportsTab리포트 생성완료
6crawlerCrawlerTab실시간 크롤 모니터링 (5초)완료
7false-positivesFalsePositiveTabFP 리뷰 & 예외 승인완료
8hitl-queueHitlQueueTabHuman-in-the-loop 큐완료
9learningLearningTab학습 후보 & 자동 적용완료
10performancePerformanceTab패턴 정확도 추적완료
11historyHistoryTab개선 히스토리 타임라인완료
12ocrOcrTabOCR 이미지 분석완료
13pricingPricingTab시술 가격 데이터완료
14price-alertsPriceAlertsTab가격 변동 알림완료
15price-analyticsPriceAnalyticsTab가격 트렌드 분석완료
16mappingMappingTab시술명 매핑 승인완료
17usersUsersTab유저 관리진행
18verificationVerificationTab콘텐츠 검증진행
19settingsSettingsTab엔진 설정완료
위반 패턴 카테고리 (32개 / 161 패턴)

카테고리별 패턴 수

Phase 진행률

코드카테고리패턴 수예시
01치료효과보장7"100% 완치", "효과 보장"
02부작용부정7"부작용 없는", "무통"
03최상급표현6"최고", "최초", "유일"
04비교광고4"타사 대비", "더 나은"
05환자유인6"무료 상담", "선착순 할인"
06전후사진4동의 없는 before/after
19꼼수패턴10유니코드 치환, 이모지 대체
21-31진료과목 특화 (11개)3-5성형·피부·치과·한의원·정신과·비뇨·산부·안과·척추·다이어트·탈모
32금지어8명시적 금지 표현
자동 개선 시스템 (v1.4.0 ~ v2.0.0)
[분석 결과][사용자 피드백 수집] ── analysis_feedback_v2 (TP/FP/FN/severity_adjust) ↓ [성능 추적 서비스] ←→ [자동 학습 모듈] │ │ ├─ pattern_performance ├─ 예외 규칙 생성 ├─ context_performance ├─ 신뢰도 조정 └─ department_performance └─ 매핑 패턴 학습 ↓ ↓ └───────→ [자동 적용 엔진] ←──────┘ │ ├─ 예외 규칙: 신뢰도 95%+ & 10건+ → Auto ├─ 신뢰도: ±10% 이내 변동 → Auto ├─ 매핑: 일치 5건+ → Auto └─ 새 패턴: → 항상 수동
Auth System v2 — 조직 모델
가입 3경로
doctor 의사 면허 인증 → LicenseUpload
hospital 사업자등록 인증 → BizRegUpload
invited 초대 링크 → InviteAcceptForm
Phase 진행
Phase 1: 기본 구조
user_profiles + organizations + org_members + RBAC 4단계
Phase 2: 본인인증
폰 인증 + OCR + NTS API
Phase 3: 초대/리워드
팀 초대 링크 + 추천 보상
Phase 4: 조직 과금
쿼터 관리 + TossPayments
MADMEDVALIDATE PASS — A+B 91% / 2,700 확장 가능
검증 병원
33
최종 검증 대상
Grade A
23
70% — 깨끗
Grade B
7
21% — 경미한 이슈
Grade C
2
6% — 다수 이슈
Grade F
1
3% — 심각 (이에스청담)
A+B 비율
91%
≥ 80% → PASS 판정
등급 판정 기준
등급조건의미
Aflags < 3 AND halRate ≤ 5%깨끗. 문제 없음.
Bflags 3-5 OR halRate 5-10%경미한 이슈. 수동 확인 불필요.
Cflags 6-10 OR halRate 10-20%다수 이슈. 검토 권장.
Dflags ≥ 11 OR halRate 20-30%심각. 재크롤 필요.
FhalRate > 30% OR critical ≥ 3실패. 파이프라인 수정 필요.
2-Layer 검증 시스템
Layer 1: Rule-Based (4개 규칙)
Schema Validator (133줄)필드 유효성
doctor name 2-10자, equipment 2-50자, price ≥1000 & ≤1억, treatments 마크업 검사
Duplicate Finder (220줄)중복 탐지
정규화 → 완전일치 + Levenshtein ≤1 유사도. 의사 경력 10+명 동일 시 CRITICAL.
Range Checker (79줄)이상치 탐지
장비 >70, 시술 >150, 의사 >20, 이벤트 >15, 학술 >50. v4→v5 50%+ 감소 시 경고.
Cross-Category (83줄)논리 모순
시술 있는데 장비 0? 의사명이 시술명에? 가격 패턴 있는데 추출 0?
Layer 2: Source Tracing (원본 대조)
Text Tracer (241줄)3단계 검색
① 정규화 부분일치 → ② 토큰 60%+ 매칭 → ③ 한글 3자+ 블록 30%+ 매칭
Source PriorityMarkdown → OCR Raw
텍스트 → 마크다운 먼저 검색. 없으면 OCR 원문. 이미지 기반 추출은 SKIP (벌칙 X).
Hallucination Detector (41줄)환각 탐지
텍스트 기반 NOT_FOUND / 전체 텍스트 기반 아이템 × 100%. <5% PASS, 5-15% WARNING, >15% CRITICAL.
결과 병합Layer 1 우선
Layer 1 FLAG가 있으면 Layer 2 증거로 보강. Layer 2만 NOT_FOUND면 HAL/CRITICAL.
오류 분류 (8종)
코드유형설명심각도발생 빈도
HAL환각원본에 없는 정보를 생성critical42건 (시술+장비)
DUP중복동일/유사 항목 반복warning36건
MIS오분류잘못된 카테고리 배정warning중간
MRG마크업 잔류*, \n, HTML 태그 잔존warning중간
OMT누락존재하는 데이터 미추출warning~critical중간
MCL불일치A 의사 경력이 B에 귀속warning낮음
NUM숫자 오류가격 자릿수/연도 오류critical낮음
OBS만료종료된 이벤트 포함minor낮음

등급 분포 (33 병원)

오류 유형별 발생 빈도

시스템 판정
PASS
A+B 91% ≥ 80% 기준 충족
2,700개 병원 대규모 크롤링 확장 가능 판정
수동 검토 필요: 디에이성형외과(C), 세인트의원(C), 이에스청담(F)
오류 유형별 권장 수정
유형권장 수정
HAL프롬프트에 "원본에 없는 정보 생성 금지" 강조. few-shot 예시 추가.
DUP정규화 후 중복 제거 후처리 로직 추가. 가격+카테고리 동일 시만 제거.
MIS카테고리 분류 프롬프트 개선. attending ≠ 학회발표 규칙.
MRGHTML/마크다운 태그 제거 후처리 강화. *, \n, 연속 공백 정리.
OMT장비/가격 추출 프롬프트 보강. 누락 패턴 분석 후 타겟 수정.