# task-649.1 완료 보고서: InsuRo Pricing 페이지 노출 기능 관리자 토글

## SCQA

**S**: InsuRo Pricing 페이지에서 feature_definitions 테이블의 모든 활성 기능(is_active=true)이 플랜 비교 테이블에 표시되고 있다.

**C**: 내부 설정 항목(ai_provider, ai_image_generate 등)까지 Pricing 페이지에 노출되어, 관리자가 어떤 기능을 Pricing에 보여줄지 제어할 수 없다.

**Q**: 관리자가 Pricing 페이지에 노출할 기능을 개별적으로 토글 제어할 수 있는가?

**A**: feature_definitions 테이블에 `show_on_pricing` BOOLEAN 컬럼(기본값 true)을 추가하고, Admin UI에 "플랜 비교" 토글 스위치를 구현하여 해결. Pricing 페이지 쿼리에 `.eq('show_on_pricing', true)` 필터를 추가하여 토글 OFF된 기능은 자동 미표시. 기존 기능은 DEFAULT true로 회귀 없음. vitest 5건 전체 통과, tsc 에러 0건.

## 작업 내역

### 1. DB 마이그레이션 SQL
- **파일**: `supabase/migrations/20260317160000_feature_show_on_pricing.sql`
- ALTER TABLE: `show_on_pricing BOOLEAN NOT NULL DEFAULT true` 추가 (IF NOT EXISTS로 멱등성 보장)
- UPDATE: `ai_provider`, `ai_image_generate` → `show_on_pricing = false`

### 2. Pricing 페이지 쿼리 필터 적용
- **파일**: `src/hooks/use-pricing-data.ts`
- FeatureDefinition 인터페이스에 `show_on_pricing?: boolean` 추가
- select에 `show_on_pricing` 컬럼 추가
- `.eq("show_on_pricing", true)` 필터 추가

### 3. Admin UI 토글 추가
- **파일**: `src/pages/AdminSubscriptions.tsx`
- FeatureDef 타입에 `show_on_pricing: boolean` 추가
- `toggleShowOnPricing()` 함수 추가 (Supabase 직접 업데이트 + fetchData 리프레시)
- "기능 정의 관리" 탭의 각 기능 행에 "플랜 비교" Switch 토글 추가 (항상 표시, scale-75)

### 4. 테스트 추가
- **파일**: `src/pages/AdminSubscriptions.test.ts`
- FeatureDef show_on_pricing 관련 테스트 3건 추가

## 생성/수정 파일 목록

- (생성) `supabase/migrations/20260317160000_feature_show_on_pricing.sql`
- (수정) `src/hooks/use-pricing-data.ts` — 쿼리 필터 + 인터페이스 필드
- (수정) `src/pages/AdminSubscriptions.tsx` — 타입 + 토글 함수 + UI
- (수정) `src/pages/AdminSubscriptions.test.ts` — 테스트 3건 추가

## 테스트 결과
- vitest: 5 passed / 0 failed (AdminSubscriptions.test.ts)
- tsc --noEmit: 0 errors

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **tsc 직접 실행 시 JSX 에러** — tsconfig.json의 jsx 설정이 tsc --noEmit에 올바르게 적용됨을 확인. 파일 단위 직접 지정 시에만 발생하는 설정 이슈로, 프로젝트 빌드에는 영향 없음.
2. **FeatureDef 타입에 show_on_pricing 누락** — AdminSubscriptions.tsx의 로컬 FeatureDef 타입과 use-pricing-data.ts의 FeatureDefinition 인터페이스 양쪽에 필드 추가 완료.
3. **기존 기능 회귀 방지** — Migration SQL에서 DEFAULT true를 설정하여 기존 모든 기능이 Pricing에 계속 노출되도록 보장. ai_provider, ai_image_generate만 false로 설정.

### 범위 외 미해결 (0건)
없음.

## QC 체크리스트
- [x] 1. 다른 파일 영향: Pricing.tsx(동작 변경 — show_on_pricing 필터 적용), AdminSubscriptions.tsx(UI 변경)
- [x] 2. 엣지 케이스: 모든 기능이 show_on_pricing=false일 경우 Pricing에 기능 행 0개 표시 (빈 테이블은 기존 빈 데이터 처리와 동일)
- [x] 3. 작업 지시와 정확히 일치하는가: DB 컬럼 추가, Admin 토글, Pricing 필터 — 3가지 모두 구현
- [x] 4. 에러 처리: toggleShowOnPricing에서 supabase 에러 시 toast 표시
- [x] 5. 테스트 커버리지: 타입 검증 3건 + 기존 2건 = 5건 통과
- [x] 6. 발견 이슈 모두 해결: 3건 자체 해결
