# InsuRo 관리자 페이지 싱크 분석 보고서

**날짜**: 2026-03-14
**분석자**: 아누 (anu-direct, task-539)
**범위**: 관리자 페이지 11개 × 2차 에이전트 미팅 확정 전략 대조

---

## 분석 대상

### 관리자 페이지 (11개, 전체 구현 완료)
AdminNotices, AdminFcpa, AdminSubscriptions, AdminAIConfig, AdminImageFeedback,
AdminRoadmap, AdminCrmConfig, AdminNewsletters, AdminPremiumData, AdminOrganizations, AdminGuide

### 대조 기준
- 2차 에이전트 미팅 확정 전략 (`meetings/2026-03-14-insuro-plan-strategy.md`)
- InsuRo 비전 전략 (`research/insuro-vision-strategy.md`)
- 1차 에이전트 미팅 감사 결과 (`meetings/2026-03-14-insuro-deep-audit.md`)

---

## 싱크 불일치 목록

### CRITICAL (전략 핵심과 직접 충돌)

#### C1. Dashboard 공지사항 하드코딩 ↔ AdminNotices (DB 동적)
- **현재**: `Dashboard.tsx`에 공지 4개 하드코딩 (날짜까지 고정)
- **관리자 페이지**: `AdminNotices`는 `notices` 테이블 CRUD 완벽 지원
- **Notices.tsx** (전체 공지 페이지): DB에서 정상 조회
- **불일치**: Dashboard만 하드코딩. AdminNotices에서 공지 추가해도 Dashboard에 반영 안 됨
- **파일**: `Dashboard.tsx:81-86` (하드코딩) vs `Notices.tsx:40-50` (DB 조회)
- **수정**: Dashboard 공지를 `notices` 테이블에서 최신 4건 조회로 변경

#### C2. AdminAIConfig (싱글톤) ↔ 플랜별 모델 차별화 전략
- **현재**: `ai_config` 테이블 = 단일 레코드. 전체 사용자에게 동일 모델 적용
- **추가로**: 사용자가 `GenerateSettingsPanel`에서 모델을 직접 선택 가능 (제한 없음)
- **미팅 확정**: 무료=Flash, 프로=Pro, 프리미엄/히든=최상위 모델
- **불일치**: 관리자가 설정한 하나의 모델이 전체 적용. 플랜별 모델 매핑 없음
- **파일**: `AdminAIConfig.tsx` (싱글톤), `generate-content/index.ts:188` (모델 선택)
- **수정**: `subscription_plans.features`에 `ai_model` 키 추가 + 백엔드에서 플랜→모델 강제 매핑

#### C3. 월간 사용량 제한 미집행
- **현재**: `max_contents_per_month`는 MyPage에서 표시만 되고 **실제 차단 없음**
- **미팅 확정**: 무료=5회/월, 프로=100회/월, 프리미엄=무제한
- **불일치**: 무료 사용자도 무제한 콘텐츠 생성 가능
- **파일**: `MyPage.tsx` (표시만), `generate-content/index.ts` (체크 없음)
- **수정**: `generate-content` 함수에서 월간 사용량 체크 + 429 응답 → PlanUpgradeDialog

#### C4. 채널 제한 미구현
- **현재**: 모든 사용자가 5채널 전부 접근 가능 (블로그/인스타/쓰레드/카카오/대본)
- **미팅 확정**: 무료=블로그 1채널만, 프로=5채널 전체
- **불일치**: 채널 제한 기능 자체가 존재하지 않음
- **파일**: `Generate.tsx` (채널 선택에 플랜 체크 없음)
- **수정**: 채널 목록을 플랜별 필터링 + 잠금 채널 표시

### HIGH (기능 연동 불완전)

#### H1. AdminSubscriptions 플랜 구조 ↔ 5단계 플랜 전략
- **현재 시드 데이터**: Free(0원), Basic(29,000원), Pro(59,000원), Enterprise(협의)
- **미팅 확정**: 무료, 프로, 프리미엄(100명 한정), 엔터프라이즈, 히든(가족)
- **불일치**:
  - "Basic" 플랜이 전략에 없음 (제거 또는 프로로 병합 필요)
  - "프리미엄(100명 한정)" 미존재
  - "히든(가족)" 미존재 (단, `is_public=false` 플래그는 이미 지원)
- **AdminSubscriptions 기능**: 이미 `is_public` 토글 지원하므로 히든 생성 가능
- **수정**: 시드 데이터를 5단계 전략에 맞게 업데이트 + 100명 제한 로직 추가

#### H2. CRM 접근 플랜 게이팅 부재
- **현재**: CRM 관련 페이지에 플랜 체크 없음. 무료 사용자도 접근 가능
- **미팅 확정**: CRM은 프로 이상만 사용 가능
- **AdminCrmConfig**: 전체 기능을 "활성" 상태로 표시 (플랜 무관)
- **수정**: CRM 페이지에 `PlanGuard requiredPlan="pro"` 적용

#### H3. 키워드 분석 3단계 접근 미구현
- **현재**: `keyword_tools` = 단일 boolean 플래그 (있다/없다)
- **미팅 확정**: 프로=기본 키워드분석, 프리미엄=전체 공개, 히든=알고리즘 접근
- **불일치**: 3단계 분류 없이 on/off만 가능
- **수정**: `keyword_tools` → `keyword_tools_basic`, `keyword_tools_full`, `keyword_tools_algorithm` 분리

#### H4. PlanUpgradeDialog 플랜명 불일치
- **현재**: Free, Basic, Pro, Enterprise (영문명)
- **미팅 확정**: 무료, 프로, 프리미엄(100명 한정), 엔터프라이즈
- **할인율 하드코딩**: 오픈 할인 20%, 연간 할인 15% → DB 미연동
- **수정**: 플랜명을 DB에서 가져오므로 DB 업데이트 시 자동 반영. 할인율은 별도 외부화

#### H5. 100명 한정 프리미엄 — Race Condition 방지 없음
- **현재**: 구독 생성 시 동시 접근 제어 없음 (단순 INSERT)
- **미팅 확정**: DB 트랜잭션 레벨 lock (SELECT FOR UPDATE)
- **AdminSubscriptions**: 플랜 정원(capacity) 필드 자체가 없음
- **수정**: `subscription_plans`에 `max_capacity` 컬럼 추가 + 구독 생성 시 트랜잭션 잠금

### MEDIUM (개선 권장)

#### M1. AdminCrmConfig — ElevenLabs STT 미연동 표시
- **현재**: "Not Configured" 상태로 표시
- 실제 ElevenLabs 연동 여부와 무관하게 하드코딩된 상태값
- **수정**: 실제 API 키 존재 여부 체크로 동적 표시

#### M2. AdminGuide — 사이드바 섹션 구조
- **현재 섹션**: 내 계정, 안내, AI 마케팅, 고객관리, 보험 시장분석 AI, 유용한도구
- **Phase 3 계획**: 3허브 재구조화 (콘텐츠 생성/고객 관리/분석·리포트)
- **불일치**: Phase 3 메뉴 재구조화 후 guide_categories.sidebar_section도 업데이트 필요
- **수정**: Phase 3 진행 시 함께 업데이트

#### M3. AdminRoadmap — Phase 계획 미반영
- **현재**: 로드맵 데이터가 DB에 있으나, 이번 미팅에서 확정된 4-Phase 구조와 동기화 안 됨
- **수정**: AdminRoadmap에서 현재 Phase 계획 업데이트 (수동 작업, 코드 변경 불필요)

#### M4. 관리자 액션 감사 로그 부재
- **현재**: 관리자 CRUD 작업에 대한 감사 로그 없음
- **미팅 확정(1차)**: `audit_logs` 테이블 + DB Function trigger (금소법 의무)
- **수정**: Phase 2 보안 3종에 포함됨

#### M5. PlanGuard 클라이언트 전용 (보안 취약)
- **현재**: `PlanGuard.tsx` = React 컴포넌트 (DevTools로 우회 가능)
- **미팅 확정**: 서버사이드(API Route)에서 플랜 체크 강제
- **수정**: Phase 2 보안 3종에 포함됨

#### M6. feature_definitions 카테고리 불완전
- **현재 카테고리**: menu, ai_token, limit, org
- **필요 카테고리 추가**: model (모델 등급), channel (채널 접근), knowhow (노하우 접근)
- **수정**: AdminSubscriptions의 feature_definitions에 새 카테고리 추가

---

## Phase 계획 업데이트 제안

### 기존 Phase 구조 (2차 미팅 확정)
- Phase 1: routes.ts + patent/npv 삭제 + 맛보기/잠금 페이지
- Phase 2: 보안 3종 + 서버사이드 플랜 검증 + 하드코드 외부화
- Phase 3: 메뉴 재구조화 + 코드 품질
- Phase 4: Threads 카드뉴스

### 싱크 수정 항목 Phase 배정

**Phase 1에 추가:**
- [C1] Dashboard 공지 하드코딩 → DB 동적 연동 (하드코드 외부화의 일환)

**Phase 2에 추가:**
- [C2] AdminAIConfig 싱글톤 → 플랜별 모델 매핑 (서버사이드 플랜 검증의 일환)
- [C3] 월간 사용량 제한 백엔드 집행 (서버사이드 플랜 검증)
- [C4] 채널 제한 구현 (서버사이드 플랜 검증)
- [H1] subscription_plans 시드 데이터 5단계 전략 정렬 (플랜 검증 전제조건)
- [H2] CRM PlanGuard 적용 (플랜 검증)
- [H3] 키워드 분석 3단계 feature_definitions 확장 (플랜 검증)
- [H5] 100명 한정 트랜잭션 잠금 (보안)
- [M5] PlanGuard 서버사이드 강화 (보안 3종)
- [M6] feature_definitions 카테고리 확장 (플랜 검증 전제조건)

**Phase 3에 추가:**
- [M2] AdminGuide sidebar_section 업데이트 (메뉴 재구조화와 동시)
- [H4] PlanUpgradeDialog 플랜명 정렬 (DB 업데이트로 자동 반영)

**수동 작업 (코드 변경 불필요):**
- [M3] AdminRoadmap에 현재 Phase 계획 수동 입력

---

## 결론

관리자 페이지 11개 모두 **기능 구현 자체는 완벽** (TODO 0건, CRUD 완비, DB 연동).
그러나 **2차 미팅에서 확정된 5단계 플랜 전략과의 정합성**에서 싱크 불일치 13건 발견:
- CRITICAL 4건: 전략 핵심과 직접 충돌 (하드코딩, 모델 싱글톤, 사용량/채널 미집행)
- HIGH 5건: 기능 연동 불완전 (플랜 구조, CRM 게이팅, 키워드 3단계 등)
- MEDIUM 4건: 개선 권장 (감사 로그, 가이드 섹션, 카테고리 확장 등)

**핵심 패턴**: 관리자 페이지는 "설정 저장" 기능은 완벽하나, **저장된 설정이 실제 사용자 경험에 강제 적용되지 않는** 구간이 다수 존재.
