---
task_id: task-2232
type: context
scope: task
created: 2026-04-27
updated: 2026-04-27
status: in-progress
---

# 맥락 노트: task-2232

**task**: task-2232

---

## 결정 근거

### 3 Step Why

1st Why: InsuRo 소식지 데이터를 InsuWiki에서도 활용 → 단방향 push API 필요
2nd Why: push 방식은 InsuWiki→InsuRo DB 직접 접근 대비 결합도 최소화
3rd Why: 현재 업로드 빈도(월 수십건)에서 메시지 큐는 오버엔지니어링. httpx + BackgroundTasks로 non-blocking 보장 충분

### Codex 리뷰 반영 설계 변경

1. requests.post → httpx.AsyncClient + BackgroundTasks (진정한 non-blocking)
   - 기각: outbox 테이블 (현재 규모 불필요, 로깅으로 추적 가능)
2. 문서 ID: `{source}:{source_id}` 복합 키로 충돌 방지
3. 수신 API: 필수 필드 검증 + source enum + month_key 형식 검증
4. Firestore rules: admin SDK 전용 (클라이언트 읽기 불허)
5. UI: Server Component에서 admin SDK로 조회 → 목록에는 title/company만, 원문은 펼치기

### 주요 기술 결정

- InsuRo: 기존 httpx import 활용 (http_client alias), BackgroundTasks 파라미터 추가
- InsuWiki: Next.js API Route + Server Component, firebase-admin으로 Firestore 접근
- 환경변수: INSURO_SYNC_API_KEY (양쪽 동일), INSUWIKI_SYNC_URL (InsuRo 측)

## 참조 자료

- InsuRo upload endpoint: `/home/jay/projects/InsuRo/server/main.py:3588`
- InsuWiki firebase-admin: `/home/jay/projects/insuwiki/nextapp/src/lib/firebase-admin.ts`
- Codex gate result: `/home/jay/workspace/memory/events/task-2232.codex-gate`

## 주의사항

- InsuWiki → InsuRo DB 방향 절대 금지 (핵심 규칙)
- push 실패 시 InsuRo 업로드에 영향 없어야 함 (BackgroundTasks로 분리)
- main.py 4151줄 대형 파일 — Edit 시 offset/limit으로 정확한 위치 확인 후 수정
