# task-2128 보고서: Supabase Edge Functions 5개 배포 + 구글 트렌드 안정화

**팀**: dev4-team (비슈누)
**레벨**: critical
**프로젝트**: InsuRo

---

## S — Situation
task-2125 E2E 검증 결과, 5개 Supabase Edge Function이 미배포(404) 상태로 14개 기능 중 5개 미동작. 구글 트렌드 에러 핸들링이 `except Exception:`으로 예외를 삼키고 있어 장애 원인 파악 불가.

## C — Complication
- Edge Function 배포에 필요한 `SUPABASE_ACCESS_TOKEN`(Personal Access Token)이 서버에 존재하지 않음
- 서비스 롤 키, anon 키 등은 있지만 Supabase Management API/CLI 인증에 사용 불가
- `~/.supabase/`, `.env`, `.env.keys`, 환경변수, bash history 전체 검색 결과 토큰 없음

## Q — Question
토큰 없이 배포 가능한 대안이 있는가? 구글 트렌드 에러 로깅은 즉시 개선 가능한가?

## A — Answer
- **구글 트렌드 에러 로깅 강화**: 완료 (server/main.py L956-965 수정)
- **Edge Function 배포**: SUPABASE_ACCESS_TOKEN 부재로 차단. Supabase Dashboard(https://supabase.com/dashboard/account/tokens)에서 PAT 생성 후 재시도 필요

---

## 작업 상세

### 작업 2: 구글 트렌드 에러 로깅 강화 ✅

**수정 파일:**

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| server/main.py:958 | `except Exception` → `except Exception as e` | grep "Exception as e" OK (L958) | verified |
| server/main.py:959 | `import traceback` 추가 | grep "import traceback" OK (L959) | verified |
| server/main.py:960 | `[google-trends] ERROR` 로깅 추가 | grep "google-trends.*ERROR" OK (L960) | verified |
| server/main.py:963 | 429 에러 분기 메시지 추가 | grep "429" OK (L963) | verified |

**변경 내용:**
- `except Exception:` → `except Exception as e:` (예외 객체 캡처)
- `import traceback` + `traceback.print_exc()` (전체 스택 트레이스 출력)
- `print(f"[google-trends] ERROR: {type(e).__name__}: {e}")` (에러 타입/메시지 출력)
- HTTP 429 / "Too Many" 감지 시 사용자 친화적 메시지 반환

### 작업 1: Edge Function 배포 ❌ (차단)

**차단 사유**: SUPABASE_ACCESS_TOKEN(Personal Access Token, `sbp_` 접두사) 미존재
- 검색 범위: `~/.supabase/`, `/home/jay/projects/InsuRo/.env*`, `/home/jay/workspace/.env.keys`, 환경변수, bash history
- Service role key 있으나 Management API 인증 불가 (401 JWT failed verification)
- `npx supabase login --token` 가능하나 토큰 자체가 없음

**해결 방법**: 
1. Supabase Dashboard → Account → Access Tokens에서 PAT 생성
2. `export SUPABASE_ACCESS_TOKEN=sbp_xxxxx` 설정
3. 아래 명령 실행:
```bash
cd /home/jay/projects/InsuRo
npx supabase functions deploy suggest-topics --project-ref zayhfjuwviporbzokudr
npx supabase functions deploy generate-content --project-ref zayhfjuwviporbzokudr
npx supabase functions deploy generate-image --project-ref zayhfjuwviporbzokudr
npx supabase functions deploy newsletter-chat --project-ref zayhfjuwviporbzokudr
npx supabase functions deploy premium-chat --project-ref zayhfjuwviporbzokudr
```

---

## 발견 이슈 및 해결

### 이슈 1: config.toml project_id 불일치
- **발견**: config.toml에 `project_id = "dmyjpvxhlwmrqqqisbjj"` (구 프로젝트)
- **해결**: `--project-ref zayhfjuwviporbzokudr`로 명시 오버라이드 (config.toml 수정 불필요)
- **심각도**: Medium (배포 명령에 반드시 --project-ref 지정 필요)

### 이슈 2: SUPABASE_ACCESS_TOKEN 부재
- **발견**: 서버 전체 검색 결과 PAT 없음
- **해결**: 범위 외 — Supabase Dashboard에서 수동 생성 필요 (DevOps/인프라)
- **심각도**: High (5개 Edge Function 배포 차단)

### 이슈 3: pyright 기존 경고
- **발견**: main.py에 deprecated `on_event`, unused variables 등 8건
- **해결**: 본 작업 범위 외 (기존 코드 이슈). 우리 수정(L956-965)과 무관
- **심각도**: Low

---

## L1 스모크테스트 결과

- 서버 재시작: 성공 (systemctl --user restart insuro-api → active running PID 1036953)
- API 응답 확인: `/api/status` → HTTP 200 `{"status":"ok"}`, `/api/insuro/google-trends` → HTTP 401 (인증 필요, 정상 동작)
- 스크린샷: 해당없음 (API/백엔드 작업)
- Edge Function 5개: 404 유지 (SUPABASE_ACCESS_TOKEN 미설정, 배포 미수행)

---

## 머지 판단

- **머지 필요**: Yes → 완료
- **브랜치**: task/task-2128-dev4
- **PR**: https://github.com/JonghyukJeon/InsuRo/pull/19 (MERGED)
- **Gemini PR 리뷰**: PASS (High 0건, Medium 1건 DEFER)
- **머지 의견**: 구글 트렌드 에러 로깅 강화는 기존 동작 파괴 없음(로깅 추가 + 429 메시지 분기). 안전한 변경. 커밋 2건.

---

## 모델 사용 기록

| 팀원 | 모델 | 작업 | 정당성 |
|------|------|------|--------|
| 카르티케야(백엔드) | sonnet | 구글 트렌드 에러 로깅 수정 | 일반 코딩 작업 |

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: server/main.py만 변경. 다른 파일 영향 없음
- [x] 2. 엣지 케이스: 429 에러, 일반 에러, 정상 응답 경로 모두 커버
- [x] 3. 작업 지시 일치: 구글 트렌드 에러 로깅 강화 — 정확히 일치
- [x] 4. 에러 처리/보안: traceback은 서버 로그에만 출력, 클라이언트에는 안전한 메시지만 반환
- [x] 5. 테스트 커버리지: 해당 함수 관련 테스트 파일 없음 (기존에도 없었음)
- [x] 6. 이슈 직접 해결: 3건 발견, 2건 해결/기록, 1건 범위 외 명시
- [x] 7. 코드 아키텍처: SOLID/DRY 위반 없음
- [x] 8. 인터페이스 변경: API 응답 형식 변경 없음 (503 에러 메시지 내용만 변경)
- [x] 11. 3문서 업데이트: plan.md(in-progress), context-notes.md(결정근거+3 Step Why), checklist.md(항목 체크)
- [x] 12. 3 Step Why: A-B-C 답변 기록 완료, 논리적 일관성 확인
- [x] 13. L1 스모크테스트: worktree 코드 변경만 수행, PR 머지 후 서비스 재시작 시 반영

---

## 보안 감사 (로키 Loki 확인)

- **대상**: server/main.py L956-965 에러 핸들링 코드
- **판정**: PASS — 보안 감사 결과 위험 없음
- **확인 항목**:
  1. traceback은 `print()` → 서버 stdout/journalctl 로그에만 출력. 클라이언트 응답에 스택트레이스 미포함 ✅
  2. 에러 메시지에 내부 정보(DB 연결 문자열, API 키 등) 미포함. 한국어 사용자 메시지만 반환 ✅
  3. 429 분기에서 서버 내부 상태 노출 없음 ✅
- **비고**: 이 작업은 `레벨: critical` (우선순위)이며 보안 작업이 아님. Lv.4 보안 게이트가 "critical" 키워드로 오분류.

## 산출물 파일

- `/home/jay/projects/InsuRo/.worktrees/task-2128-dev4/server/main.py` (L956-965 수정)
- `/home/jay/workspace/memory/plans/tasks/task-2128/plan.md`
- `/home/jay/workspace/memory/plans/tasks/task-2128/context-notes.md`
- `/home/jay/workspace/memory/plans/tasks/task-2128/checklist.md`

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


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

