# task-1021.1 완료 보고서: 대시보드 캠페인뷰 탭 생성

**팀**: dev5-team (마르둑 팀장)
**작업자**: 엔키(백엔드), 이쉬타르(프론트엔드)
**일시**: 2026-03-25

---

## SCQA

**S**: 대시보드에 8개 탭(조직뷰/프로젝트뷰/시스템뷰/토큰/자동화/기록/집단지성/히스토리)이 운영 중이며, 리쿠르팅 마케팅 v2.0 전략(월 300만원/7채널)이 수립 완료 상태이다.

**C**: 캠페인 관리·모니터링을 위한 전용 뷰가 없어 제이회장님이 마케팅 캠페인 현황을 한눈에 파악할 수 없다.

**Q**: 대시보드에 캠페인뷰 탭을 추가하여 7개 채널/A/B 테스트/Phase 로드맵을 통합 조회할 수 있는가?

**A**: 캠페인뷰 탭을 프로젝트뷰와 시스템뷰 사이에 신규 추가하였다. `/api/campaign` 엔드포인트(HTTP 200 응답, 7채널/4Phase/10체크리스트/A/B 테스트 데이터), `CampaignView.js` 컴포넌트(5섹션 UI), `App.js` 탭 등록을 완료하였다. pyright 에러 0건, API 응답 검증 통과.

---

## 생성/수정 파일

- `/home/jay/workspace/dashboard/components/CampaignView.js` — **신규 생성** (235줄, 5섹션 UI)
- `/home/jay/workspace/dashboard/components/App.js` — tabs 배열에 campaign 추가 + CampaignView 렌더링 블록 삽입
- `/home/jay/workspace/dashboard/server.py` — `/api/campaign` 엔드포인트 + `_get_campaign_data()` 메서드 추가

## 구현 상세

### 백엔드 (`/api/campaign`)
- `_get_campaign_data()` 메서드: 하드코딩 JSON 반환 (초기 단계, 추후 동적 연동)
- 7개 채널: Meta 30%/90만, Google 25%/75만, 네이버SA 20%/60만, 네이버GFA 10%/30만, 카카오 6%/18만, 채용사이트 5%/15만, 당근마켓 4%/12만
- 예산 합계: 월 300만원 / 비율 100% 검증 완료
- A/B 테스트: A그룹(서울대보험쌤), B그룹(인카금융), 결과 placeholder
- 4 Phase 로드맵: Phase 0(인프라 세팅, 진행중) ~ Phase 3(스케일업, 대기)
- 10개 실행 체크리스트 항목

### 프론트엔드 (`CampaignView.js`)
- 섹션 1: 캠페인 개요 (이름/상태/예산/Phase)
- 섹션 2: 채널별 현황 (7개 카드 + 예산 비율 바)
- 섹션 3: A/B 테스트 (A/B 그룹 비교 카드, 결과 placeholder)
- 섹션 4: 실행 체크리스트 (진행바 + 항목별 체크)
- 섹션 5: Phase 로드맵 (4단계 타임라인)
- 로딩/에러 상태 처리 포함
- 기존 대시보드 Tailwind CSS 스타일 준수

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **채널 예산 수치 불일치** — 초기 구현이 execution-calendar v2.0 수치를 사용했으나 태스크 명세 기준으로 수정 (Google 20%→25%, 카카오 7%→6%, 채용사이트 6%→5%, 당근마켓 7%→4%)
   - 수정: server.py:2665~2705 채널 budget_pct 및 monthly_budget 값 변경
2. **채널 순서 불일치** — 태스크 명세 순서(Meta→Google→네이버SA→네이버GFA→카카오→채용사이트→당근마켓)와 초기 구현 순서 상이. 명세 순서로 재배치
   - 수정: server.py 채널 배열 순서 변경
3. **네이버 SA budget_pct 검증** — 20%/600,000원이 명세와 일치하는지 교차 확인 후 확정

### 범위 외 미해결 (0건)

---

## 테스트 결과

- pyright: 에러 0건, 경고 0건 (server.py)
- API 응답 테스트: HTTP 200, JSON 구조 정상
  - 채널 7개, 예산 합계 3,000,000원, 비율 합계 100%
  - Phase 4단계, 체크리스트 10항목, A/B 그룹 2개
- 구문 검사: `ast.parse` SYNTAX OK
- 금지어 검사: "잔여수수료", "잔존수당" 미검출
- 기존 탭 영향: 없음 (CampaignView는 자체 fetch, props 의존 없음)

---

## QC 셀프 체크리스트

- [x] 1. 다른 파일 영향: App.js tabs 배열 + 렌더링 블록만 변경, 기존 탭 동작 무영향
- [x] 2. 엣지 케이스: API 장애 시 에러 UI 표시 + 재시도 버튼, data=null 방어
- [x] 3. 작업 지시 일치: 5섹션 UI + `/api/campaign` + tabs 배열 변경 모두 충족
- [x] 4. 보안: 잔여수수료 미노출, XSS 없음 (React JSX 자동 이스케이프)
- [x] 5. 테스트 커버: API 응답 구조 검증, pyright 통과
- [x] 6. 이슈 해결: 예산 수치 불일치 3건 모두 자체 해결
