# task-2174: InsuRo 프로덕션 API 에러 3건 긴급 수정

## SCQA

**S**: InsuRo 프로덕션 서버에서 3개의 API 에러가 발생 중이다. 전수조사(task-2172/2173)에서 발견된 프론트엔드 UI는 정상 반영되었으나, 백엔드 API에서 500/405/400 에러가 각각 발생하고 있다.

**C**: 세 에러의 공통 근본 원인은 Supabase DB 마이그레이션 미적용이다. (1) keyword_jobs 테이블 미존재로 500 에러, (2) compliance_consents/compliance_versions 테이블 미존재 + 프론트엔드 서버 URL 미설정으로 405 에러, (3) profiles 테이블에 onboarding_step/ab_test_group/phone_number/email 컬럼 미존재로 400 에러.

**Q**: 누락된 마이그레이션 적용과 프론트엔드 URL 수정으로 3개 에러를 모두 해소할 수 있는가?

**A**: 8개 마이그레이션 SQL + ab_test_group 컬럼 수동 추가를 Supabase Management API로 적용하고, use-compliance-consent.ts의 서버 URL fallback을 INSURO_API_BASE로 통일하여 3개 에러 모두 해소 완료. curl 테스트로 모든 API 정상 응답 확인.

## 수정 내용

### 에러 1: keywords/analyze 500 → 200
- **원인**: `keyword_jobs` 테이블이 Supabase DB에 미존재 (PostgREST PGRST205 에러)
- **수정**: 마이그레이션 `20260420000000_keyword_jobs_table.sql` 적용
- **검증**: 히든 유저 JWT로 POST /api/insuro/keywords/analyze 호출 → 200 + job_id 반환

### 에러 2: compliance/consent 405 → 200
- **원인 1**: `compliance_consents`, `compliance_versions` 테이블 미존재
- **원인 2**: `use-compliance-consent.ts`에서 `VITE_INSURO_SERVER_URL` (빈 문자열 fallback) 사용 → Vite 서버로 요청 전달 → 405
- **수정 1**: 마이그레이션 `20260424180000_compliance_consents.sql` 적용 (compliance_versions에 v1.0 초기 데이터 포함)
- **수정 2**: `use-compliance-consent.ts`를 `@/config/api`의 `INSURO_API_BASE`로 통일
- **검증**: GET /api/insuro/compliance/consent-status → 200 + `{"current_version": "v1.0"}`

### 에러 3: profiles 400 → 200
- **원인**: profiles 테이블에 `onboarding_step`, `ab_test_group`, `phone_number`, `email` 컬럼 미존재
- **수정**: 4개 마이그레이션 적용 (20260419, 20260420x2, 20260422x2) + ab_test_group 수동 ALTER TABLE
- **검증**: REST API로 profiles?select=onboarding_step,ab_test_group → 200

## 적용 마이그레이션 목록

1. `20260419000000_add_onboarding_step.sql`
2. `20260420000000_keyword_jobs_table.sql`
3. `20260420000001_wiki_rankings_rpc.sql`
4. `20260420100000_fix_existing_users_onboarding.sql`
5. `20260420200000_onboarding_default_null.sql`
6. `20260422000000_add_infokeyword_access.sql`
7. `20260422120000_add_phone_email_to_profiles.sql`
8. `20260424180000_compliance_consents.sql`
9. `ALTER TABLE profiles ADD COLUMN IF NOT EXISTS ab_test_group TEXT` (수동)

## 수정 파일

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| src/hooks/use-compliance-consent.ts:4 | INSURO_API_BASE import 추가 | grep "INSURO_API_BASE" OK (3건) | verified |
| src/hooks/use-compliance-consent.ts:34 | consent-status URL을 INSURO_API_BASE 사용으로 변경 | grep "INSURO_API_BASE.*consent-status" OK | verified |
| src/hooks/use-compliance-consent.ts:66 | consent URL을 INSURO_API_BASE 사용으로 변경 | grep "INSURO_API_BASE.*consent\"" OK | verified |

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **keyword_jobs 테이블 미존재** — Supabase Management API로 마이그레이션 적용
2. **compliance 테이블 미존재** — 마이그레이션 적용 + 초기 면책 문구 v1.0 삽입
3. **profiles 컬럼 미존재** — 4개 컬럼(onboarding_step, ab_test_group, phone_number, email) 마이그레이션 적용

### 범위 외 미해결 (1건)
1. **InfoKeyword Worker 서버 미동작** — keywords/analyze API 자체는 200 반환하나, 백그라운드 분석 작업에서 Worker 서버(`INFOKEYWORD_WORKER_URL`) 연결 실패. 별도 서비스 의존성으로 본 task 범위 외. Worker 서비스 배포/실행이 필요함.

## L1 스모크테스트 결과

- 서버 재시작: 성공 (PID 2503031, uvicorn port 8001)
- API 응답 확인:
  - `GET /api/status` → 200
  - `POST /api/insuro/keywords/analyze` (히든 유저 JWT) → 200 `{"job_id":"e040c780...","status":"pending"}`
  - `GET /api/insuro/compliance/consent-status` → 200 `{"has_valid_consent":false,"current_version":"v1.0"}`
  - `POST /api/insuro/compliance/consent` → 400 (정상: 해시 불일치 검증 동작)
  - `GET /rest/v1/profiles?select=onboarding_step` → 200
- 스크린샷: 해당없음 (백엔드 API 작업)

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-2174-dev3
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2174-dev3
- **머지 의견**: 프론트엔드 1파일 수정만 포함 (URL 통일). DB 마이그레이션은 프로덕션에 직접 적용 완료. 충돌 가능성 낮음.

## 모델 사용 기록

- 팀원: 루(Lugh) / 작업 내용: Supabase 마이그레이션 SQL 적용 / 사용 모델: sonnet
- 팀원: 브리짓(Brigid) / 작업 내용: consent hook URL 수정 / 사용 모델: sonnet

## QC 검증
- pytest: 2516 passed (full suite) + 3 passed (consent URL 테스트)
- pyright 경고: 0건 (unused import 수정 완료)
- 워크트리 커밋: 3건 (브리짓 URL 수정, 모리건 테스트 추가, 다그다 pyright 수정)


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

