# InsuRo × 인포키워드 연동 — Phase 1: 인프라 + 서버 연동

## 작업 레벨: Lv.3

## 프로젝트 시스템 3문서
- DevSystem: `/home/jay/workspace/memory/plans/anu-guide-system/plan.md`

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server`
- 인포키워드: `/home/jay/projects/InfoKeyword/.worktrees/task-926.1-dev2/worker`

## 연동 스펙
- 메모리: `/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/project_insuro_infokeyword_integration.md`

## Phase 1 범위

### 1. 인포키워드 서버 systemd 등록
인포키워드 워커 서버를 systemd user service로 상시 실행:

```ini
[Unit]
Description=InfoKeyword Worker API
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/jay/projects/InfoKeyword/.worktrees/task-926.1-dev2
Environment=PYTHONPATH=/home/jay/projects/InfoKeyword/.worktrees/task-926.1-dev2
Environment=INFORKEYWORD_API_KEY=<.env.keys에서 로드>
ExecStart=/usr/bin/python3 -m uvicorn worker.main:app --port 8100 --host 127.0.0.1
Restart=always
RestartSec=10

[Install]
WantedBy=default.target
```

파일 경로: `~/.config/systemd/user/infokeyword-worker.service`

★ API Key는 .env.keys에서 로드. 하드코딩 금지.
★ host를 127.0.0.1로 제한 (InsuRo 서버에서만 접근)

### 2. InsuRo 서버에 인포키워드 프록시 엔드포인트 추가
`server/main.py`에 아래 엔드포인트 추가:

#### POST /api/insuro/infokeyword/generate
- 키워드 생성 요청 → 인포키워드 `/generate` 호출
- 플랜 검증: 맥스+ (require_feature("infokeyword_analyze"))
- 요청: `{"topic": "암보험", "count": 30}`
- 응답: 인포키워드 결과 그대로 전달

#### POST /api/insuro/infokeyword/analyze
- 7단계 분석 요청 → 인포키워드 `/analyze` 호출
- 플랜 검증: 맥스+
- **월 사용량 제한**: token_usage_log 테이블에서 이번 달 사용 횟수 확인
  - 초과 시 HTTP 429 반환 ("이번 달 분석 횟수를 초과했습니다")
- **근거 리포트 스킵**: 인포키워드 API 호출 시 `skip_report=true` 파라미터 전달
  - 인포키워드 서버에서 이 파라미터가 true이면 스크린샷 + 리포트 생성 스킵
- 요청: `{"keywords": ["암보험 비교", "실손보험 추천"]}`
- 응답: analysis_id 반환

#### GET /api/insuro/infokeyword/status/{analysis_id}
- 분석 결과 조회 → 인포키워드 `/status/{analysis_id}` 호출
- 사용자 본인 요청만 조회 가능 (user_id 검증)
- 응답: 분석 결과 (steps, verdict 등)

#### GET /api/insuro/infokeyword/history
- 사용자 본인의 과거 분석 이력 조회
- Supabase infokeyword_analyses 테이블에서 조회

### 3. 인포키워드 서버에 skip_report 파라미터 추가
`worker/pipeline/analyzer.py`의 `analyze_keyword()` 함수에 `skip_report` 파라미터 추가:
- `skip_report=True`이면 스크린샷 캡처 + HTML 리포트 생성 + GCS 업로드 전부 스킵
- 분석 로직(step 1~7)은 그대로 실행

### 4. DB 테이블: infokeyword_analyses
Supabase에 분석 이력 저장:
```sql
CREATE TABLE infokeyword_analyses (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id uuid REFERENCES auth.users(id),
  analysis_id text NOT NULL,  -- 인포키워드 서버 ID
  keywords jsonb NOT NULL,    -- 요청 키워드 배열
  results jsonb,              -- 분석 결과
  status text DEFAULT 'pending',  -- pending/processing/completed/failed
  created_at timestamptz DEFAULT now()
);
CREATE INDEX idx_infokeyword_user ON infokeyword_analyses(user_id, created_at DESC);
ALTER TABLE infokeyword_analyses ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view own analyses" ON infokeyword_analyses
  FOR SELECT USING (auth.uid() = user_id);
```

### 5. planSkillMap에 인포키워드 기능 추가
`src/config/planSkillMap.ts` — 맥스+ 플랜에 infokeyword_analyze 기능 추가

## affected_files
- `~/.config/systemd/user/infokeyword-worker.service` (신규)
- `server/main.py` (수정 — 인포키워드 프록시 4개 엔드포인트)
- `worker/pipeline/analyzer.py` (수정 — skip_report 파라미터)
- `worker/main.py` (수정 — analyze 엔드포인트에 skip_report 전달)
- `supabase/migrations/` (신규 — infokeyword_analyses 테이블)
- `src/config/planSkillMap.ts` (수정 — infokeyword_analyze 추가)

## 검증 시나리오
1. `systemctl --user start infokeyword-worker` → 포트 8100 정상 기동
2. InsuRo API `/api/insuro/infokeyword/generate` → 키워드 30개 반환
3. InsuRo API `/api/insuro/infokeyword/analyze` → analysis_id 반환 + 근거 리포트 미생성
4. 분석 완료 후 `/status/{id}` → 7단계 결과 반환 + report_url 없음
5. 무료/베이직/프로 플랜 → 403 접근 거부
6. 맥스 플랜 → 정상 접근
7. 월 사용량 초과 → 429 반환
8. `/history` → 본인 이력만 반환
9. npm run build 성공
10. InsuRo 서버 재시작 정상