# task-1504.1 완료 보고서: 구글광고현황 기간 필터 + 분석 기능 완성

## SCQA

**S**: GoogleAdsSection의 기간 필터는 4개(오늘/7일/14일/30일)만 제공하며, MetaAdsSection은 7개(오늘/어제/7일/14일/30일/전체/커스텀) 기간 옵션과 커스텀 날짜 입력 UI를 갖추고 있다.

**C**: 두 광고 섹션 간 기간 필터 UX가 불일치하여 사용자가 Google Ads에서 어제/전체/커스텀 기간 조회를 할 수 없고, 백엔드도 since/until 커스텀 날짜 파라미터를 지원하지 않는다.

**Q**: GoogleAdsSection의 기간 필터를 MetaAdsSection과 동일한 7개 옵션으로 확장하고, 커스텀 날짜 범위 API 지원을 추가할 수 있는가?

**A**: 프론트엔드(GoogleAdsSection.js) 기간 필터 7개 확장 + 커스텀 날짜 입력 UI 추가, 백엔드(google_ads_client.py) get_insights에 since/until 파라미터 추가, server.py 엔드포인트에 커스텀 날짜/어제/전체 분기 처리를 구현하여 완료. pytest 61건 전체 통과, pyright 에러 0건.

---

## 수정 파일 목록

- `/home/jay/workspace/dashboard/components/campaign/GoogleAdsSection.js` — 기간 필터 4개→7개 확장, 커스텀 날짜 UI 추가
- `/home/jay/workspace/utils/google_ads_client.py` — get_insights에 since/until 파라미터 추가, GAQL BETWEEN 지원
- `/home/jay/workspace/dashboard/server.py` — Google Ads campaigns 엔드포인트에 since/until, 어제, 전체 분기 처리 추가

---

## 변경 상세

### 1. GoogleAdsSection.js (프론트엔드)
- PERIOD_OPTIONS: 4개 → 7개 (어제/전체/커스텀 추가)
- state 추가: customStart, customEnd, showCustom
- effectiveDays 계산 로직 추가 (커스텀=-1 → 30일 fallback)
- fetchData: 커스텀 선택 시 `?since=&until=` 파라미터, 전체 선택 시 365일 변환
- handlePeriodSelect/handleCustomApply 함수 추가
- 커스텀 날짜 입력 UI (date input × 2 + 조회 버튼), green 테마 유지
- 서브컴포넌트(Drilldown, Analysis) days prop: effectiveDays 기반으로 변경

### 2. google_ads_client.py (백엔드)
- get_insights 시그니처에 `since: str | None = None`, `until: str | None = None` 추가
- GAQL 쿼리: since/until 있으면 `BETWEEN '{since}' AND '{until}'`, 없으면 기존 `DURING {date_range}`
- 로그에 since/until 정보 포함

### 3. server.py (백엔드)
- `/api/google-ads/campaigns` 엔드포인트: since/until 쿼리 파라미터 파싱
- 4개 분기: 커스텀(since/until) / 어제(days=2) / 전체(days=0,365) / 기존 프리셋
- 캐시 키 분리: cache_key_suffix로 각 분기별 고유 캐시

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: GoogleAdsSection.js, google_ads_client.py, server.py (3개)
- [x] 2. 엣지 케이스: 커스텀에서 날짜 미선택 시 조회 버튼 disabled, days=0/365 전체 처리, since/until 없을 때 기존 로직 유지
- [x] 3. 작업 지시와 정확히 일치: 기간 필터 7개, 커스텀 UI, API since/until 지원 모두 구현
- [x] 4. 에러 처리: 503/일반 에러 기존 로직 유지, 커스텀 날짜 미입력 시 fetchData 호출 방지
- [x] 5. 테스트: pytest 61건 통과 (test_google_ads_client 54건 + test_server 7건)
- [x] 6. 이슈 모두 해결 (아래 참조)
- [x] 7. 코드 아키텍처 원칙: MetaAdsSection 패턴 일관성 유지 (DRY)
- [x] 8. 인터페이스 변경: get_insights에 선택적 파라미터 추가 (하위호환)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **server.py black 포맷팅 불일치** — `black dashboard/server.py` 실행으로 해결
2. **GAQL에 YESTERDAY 프리셋 미지원 가능성** — days=2(어제)를 since/until 방식으로 처리하여 우회
3. **days=0(전체) GAQL 매핑 부재** — since/until로 최근 365일 범위 계산하여 처리

---

## 테스트 결과

- pytest: 61 passed in 0.51s (exit code 0)
- pyright: 0 errors, 0 warnings
- black: 포맷팅 적용 완료

---

## 모델 사용 기록

- 팀원: 사라스바티 / 작업: GoogleAdsSection.js 프론트엔드 수정 / 모델: sonnet
- 팀원: 카르티케야 / 작업: server.py + google_ads_client.py 백엔드 수정 / 모델: sonnet
