테마
Epic Spec: E-02 Deep Layer
메타
| 항목 | 값 |
|---|---|
| Epic ID | E-02 |
| Sprint | S52 |
| 상태 | approved |
| PO 승인일 | - |
| 담당 | 수민 (FE), 하록 (BE) |
1. WHY: 왜 이 기능이 필요한가?
문제 정의
현재 광고 대시보드는 "실험실" 메뉴에 숨겨져 있다. Sprint 52에서 쿠팡 광고 기능을 정식 출시하지만, 기존 사용자도 광고 분석 기능을 발견하기 어렵다.
또한, 쿠팡 광고는 검색 광고와 비검색 광고가 완전히 다른 특성을 가지는데, 현재 대시보드는 이를 구분하지 않고 통합 수치만 보여준다.
[현재 문제]
1. "실험실" 메뉴 → 찾기 어려움 → 광고 분석 사용률 저조
2. 검색/비검색 구분 없음 → 중수 셀러의 상세 분석 니즈 미충족
3. Surface Layer만으로는 "왜 이런 상태인지" 파악 불가근거 데이터
| 지표 | 수치 | 출처 | 비고 |
|---|---|---|---|
| 실험실 메뉴 진입률 | 낮음 (추정) | - | 측정 필요 |
| 광고 상세 진입률 | 36.4% | GA4 (S50) | Surface → Deep |
| "검색/비검색 분석" VOC | 다수 | 채널톡 | 셀러 요청 |
Deep Layer vs Surface Layer
┌───────────────────────────────────────────────────────────────────┐
│ Surface Layer (초보용) │
│ "지금 어때?" → 판단 제공 (🟢🟡🔴) │
│ 기간: 고정 7일 | 선택 불가 │
│ 정보량: 최소화 (Less is More) │
└───────────────────────────────────────────────────────────────────┘
↓
[상세 보기 클릭]
↓
┌───────────────────────────────────────────────────────────────────┐
│ Deep Layer (중수용) │
│ "왜 이래?" → 상세 데이터 제공 │
│ 기간: 선택 가능 (7일/14일/30일/커스텀) │
│ 정보량: 충분한 데이터 (캠페인/상품/키워드/검색/비검색) │
└───────────────────────────────────────────────────────────────────┘기대 효과
- 발견성 향상: 실험실 → 정식 메뉴 → 광고 분석 인지도 상승
- 중수 셀러 충족: 검색/비검색 분리 분석으로 상세 의사결정 지원
- Surface ↔ Deep 연계: "왜 빨간불인지" 상세 확인 가능
2. WHAT: 상세 요구사항
핵심 기능
| # | 기능 | 설명 | 필수 여부 |
|---|---|---|---|
| 1 | 정식 메뉴 승격 | 실험실 → GNB 메인 메뉴 "광고 분석" | 필수 |
| 2 | 검색/비검색 영역 비교 탭 | 캠페인 상세에서 검색 영역 vs 비검색 영역 퍼포먼스 비교 | 필수 |
| 3 | 기간 필터 | 7일/14일/30일/커스텀 선택 | 필수 |
| 4 | 캠페인 목록 개선 | 정렬/필터 | 필수 |
| 5 | Surface → Deep 연결 | Surface Layer에서 "상세 보기" 클릭 시 Deep Layer로 이동 | 필수 |
Phase 2 예정: Status Badge (🟢🟡🔴), 요약 영역은 Surface Layer 검증 완료 후 Deep Layer에 순차 적용
비즈니스 로직
로직 1: 검색/비검색 영역 정의
[쿠팡 광고 구조]
캠페인 (Campaign)
├── 검색 광고 (Search)
│ └── 키워드 입찰 → 검색 결과 페이지 노출
│ └── 특성: 높은 구매 의도, 키워드 품질 중요
│
└── 비검색 광고 (Non-Search / Display)
└── 상품 피드 기반 자동 타겟팅
└── 특성: 브라우징 노출, 노출량 중요
[왜 분리가 중요한가?]
- 검색: CTR/CVR 중심 최적화 (키워드 조정)
- 비검색: 노출/클릭 볼륨 중심 최적화 (입찰가 조정)
- 통합 지표만 보면 어디서 문제인지 파악 불가로직 2: 검색/비검색 데이터 소스
sql
-- 검색 광고 식별
-- CoupangAdKeywordDaily 테이블에 keyword가 있으면 검색 광고
-- 캠페인별 검색/비검색 분리 집계
SELECT
campaignId,
CASE
WHEN keyword IS NOT NULL THEN 'SEARCH'
ELSE 'NON_SEARCH'
END as adType,
SUM(exposureCount) as impressions,
SUM(clickCount) as clicks,
SUM(adCost) as spend,
SUM(conversionAmount) as revenue
FROM CoupangAdKeywordDaily
WHERE vendorId = ?
AND adDate BETWEEN ? AND ?
GROUP BY campaignId, adType;확인 필요: 비검색 광고 데이터가 현재 수집되는지 BE 확인 필요
로직 3: 검색/비검색 지표 비교 상세
[비교 지표 목록]
┌────────────────────────────────────────────────────────────────────┐
│ 구분 │ 검색 광고 │ 비검색 광고 │
├──────────┼───────────────────────────┼───────────────────────────┤
│ 노출수 │ 키워드 검색 결과 노출 │ 피드/상세페이지 노출 │
│ 클릭수 │ 검색 결과 클릭 │ 피드 클릭 │
│ CTR │ 검색 클릭/검색 노출 ×100 │ 피드 클릭/피드 노출 ×100 │
│ 전환수 │ 검색 유입 구매 │ 피드 유입 구매 │
│ CVR │ 검색 전환/검색 클릭 ×100 │ 피드 전환/피드 클릭 ×100 │
│ 광고비 │ 검색 입찰 비용 │ 비검색 입찰 비용 │
│ 전환매출 │ 검색 유입 매출 │ 피드 유입 매출 │
│ ROAS │ 검색 매출/검색 광고비×100 │ 피드 매출/피드 광고비×100 │
│ 순이익 │ 검색 매출-원가-광고비×1.1 │ 피드 매출-원가-광고비×1.1 │
│ CPC │ 검색 광고비/검색 클릭 │ 피드 광고비/피드 클릭 │
└────────────────────────────────────────────────────────────────────┘
[비교 인사이트 제공]
- 검색 vs 비검색 CTR 비교: "검색 CTR 0.8% > 비검색 CTR 0.2%"
- 검색 vs 비검색 ROAS 비교: 어느 영역이 효율적인지
- 광고비 비중: "검색 70% : 비검색 30%"지표별 정상 범위 (참고값)
| 지표 | 검색 광고 정상 범위 | 비검색 광고 정상 범위 | 비고 |
|---|---|---|---|
| CTR | 0.5% ~ 2.0% | 0.1% ~ 0.5% | 비검색이 낮은 게 정상 |
| CVR | 5% ~ 15% | 2% ~ 8% | 비검색은 브라우징 유입 |
| CPC | 100원 ~ 300원 | 50원 ~ 150원 | 비검색이 저렴 |
| ROAS | 300% ~ 800% | 200% ~ 500% | 마진율에 따라 다름 |
로직 4: 기간 필터 옵션
[기간 선택지]
- 최근 7일 (기본값)
- 최근 14일
- 최근 30일
- 커스텀 (날짜 범위 직접 선택)
[Surface Layer와의 차이]
- Surface: 7일 고정, 선택 불가 ("지금" 집중)
- Deep: 기간 선택 가능 ("추이" 분석 가능)로직 5: 메뉴 구조 변경
[핵심]
- 실험실 → 정식 메뉴로 "광고 분석" 승격
- 기존 GNB에 메뉴 추가 (구체적 배치는 디자인에서 확정)
[변경 사항]
- 광고 분석 메뉴 추가
- 하위 메뉴: 캠페인 대시보드 (Deep Layer), 광고 진단 (Surface Layer)로직 6: 캠페인 목록 정렬/필터 옵션
[정렬 옵션]
- ROAS 높은순/낮은순 (기본: 낮은순 - 문제 캠페인 우선)
- 광고비 높은순/낮은순
- 순이익 높은순/낮은순
- 전환매출 높은순/낮은순
[필터 옵션]
- 상태별: 전체/🟢 건강/🟡 주의/🔴 위험 (Surface Layer 연계 시)
- 기간별: 7일/14일/30일/커스텀
- 캠페인 유형: 전체/검색만/비검색만 (P2)사용자 시나리오
시나리오 1: Surface → Deep 전환
1. 셀러가 광고 진단(Surface Layer)에서 캠페인 A가 🔴 위험임을 확인
2. "왜 위험하지?" → "상세 보기" 클릭
3. Deep Layer 캠페인 상세 페이지로 이동
4. 검색/비검색 탭에서 비검색 광고가 ROAS 50%임을 발견
5. "비검색 광고 입찰가를 낮춰야겠다" 판단
시나리오 2: Deep Layer 직접 진입
1. 중수 셀러가 GNB에서 "광고 분석" 클릭
2. 캠페인 목록에서 기간을 30일로 변경
3. 추이 그래프에서 2주 전부터 ROAS 하락 확인
4. 캠페인 상세 → 검색/비검색 탭에서 검색 광고 CTR 하락 발견
5. "검색 키워드를 점검해야겠다" 판단3. HOW: 플로우 & 화면
페이지 구조
[광고 분석 - 캠페인 목록]
┌─────────────────────────────────────────────────────────────────┐
│ 🔝 Header (GNB) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📊 광고 분석 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 기간: [최근 7일 ▼] | 정렬: [ROAS 낮은순 ▼] │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ [캠페인 목록] │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 캠페인 A ROAS 520% │ │
│ │ 광고비 ₩234,567 | 매출 ₩1,220,000 | 순이익 ₩85,000 │ │
│ │ [상세 보기 →] │ │
│ ├───────────────────────────────────────────────────────────┤ │
│ │ 캠페인 B ROAS 180% │ │
│ │ 광고비 ₩567,890 | 매출 ₩1,022,000 | 순이익 ₩12,000 │ │
│ │ [상세 보기 →] │ │
│ ├───────────────────────────────────────────────────────────┤ │
│ │ 캠페인 C ROAS 80% │ │
│ │ 광고비 ₩432,100 | 매출 ₩345,000 | 순이익 -₩120,000 │ │
│ │ [상세 보기 →] │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
[광고 분석 - 캠페인 상세]
┌─────────────────────────────────────────────────────────────────┐
│ 🔝 Header (GNB) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ← 캠페인 목록 | 캠페인 A │
│ │
│ 기간: [최근 7일 ▼] │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ [키워드별] [상품별] [검색/비검색 영역] [SKU단위] ... │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ [검색/비검색 영역 탭 선택 시] │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 검색 영역 vs 비검색 영역 퍼포먼스 비교 테이블 │ │
│ │ │ │
│ │ 구분 | 광고비 | 노출수 | 클릭수 | CTR | 전환수 | CVR | │ │
│ │ | 전환매출 | ROAS | 순이익 | CPC │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 추이 차트 (막대: 광고비/순이익/전환매출, 라인: ROAS) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘Note: 요약 영역, Status Badge (🟢🟡🔴)는 Phase 2에서 Surface Layer 검증 후 순차 적용 예정
디자인 요청사항
| 항목 | 내용 |
|---|---|
| 톤앤매너 | 데이터 중심, 깔끔한 대시보드 |
| 컬러 | 수익=초록, 손실=빨강 (순이익 컬럼 강조) |
| 참고 | Google Ads 대시보드, Facebook Ads Manager |
| 담당 | 차봉희 이사님 |
4. EDGE: 예외 & 엣지 케이스
데이터 예외
| 상황 | 처리 방법 |
|---|---|
| 비검색 광고 데이터 없음 | "비검색 광고" 탭 비활성화 또는 "데이터 없음" 표시 |
| 검색 광고만 운영 | 비검색 탭에 "해당 기간 비검색 광고 없음" 표시 |
| 기간 내 데이터 0건 | "선택한 기간에 광고 데이터가 없습니다" 안내 |
| 원가 미입력 | ROAS만 표시, 순이익은 "-" 또는 "원가 입력 필요" |
사용자 예외
| 상황 | 처리 방법 |
|---|---|
| 광고 연동 미완료 | "광고를 연동해주세요" 온보딩 안내 |
| 모바일 접속 | 반응형 디자인 (테이블 → 카드 리스트) |
시스템 예외
| 상황 | 처리 방법 |
|---|---|
| ETL 미완료 (state != CALCULATED) | "데이터 계산 중입니다" 표시 |
| API 타임아웃 | "잠시 후 다시 시도해주세요" + 재시도 버튼 |
5. 성공 지표
5.1 지표 체계 개요
┌─────────────────────────────────────────────────────────────┐
│ E-02 Deep Layer 지표 체계 │
├─────────────────────────────────────────────────────────────┤
│ [Sprint 내 판단] │
│ Primary: Deep Layer 진입률 +50% AND 검색/비검색 탭 사용률 ≥ 30% │
│ Secondary: Surface → Deep 전환율 ≥ 40% │
├─────────────────────────────────────────────────────────────┤
│ [Sprint 이후 확인] │
│ Lagging: Deep Layer 리텐션 (7일 후 재방문율) ≥ 40% │
│ Ultimate: KR2 이탈율 ≤ 15% 기여 │
├─────────────────────────────────────────────────────────────┤
│ [Guard Rails] │
│ • 기존 실험실 사용자 이탈 20% 이하 │
│ • 페이지 로딩 시간 3초 이내 │
│ • "데이터 없음" 표시 비율 ≤ 20% │
└─────────────────────────────────────────────────────────────┘5.2 Sprint 내 판단 지표
| 계층 | 지표 | 산식 | 목표 |
|---|---|---|---|
| Primary | Deep Layer 진입률 | Deep Layer 진입 유저 / 전체 MAU | +50% (기존 대비) |
| Primary | 검색/비검색 탭 사용률 | 검색/비검색 탭 클릭 유저 / 캠페인 상세 진입 유저 | ≥ 30% |
| Secondary | Surface → Deep 전환율 | Deep 진입 유저 / Surface 진입 유저 | ≥ 40% |
| Secondary | 기간 필터 사용률 | 기간 변경 유저 / Deep Layer 진입 유저 | 측정 (기준선) |
5.3 Sprint 이후 확인 지표
| 계층 | 지표 | 산식 | 목표 |
|---|---|---|---|
| Lagging | Deep Layer 리텐션 | 7일 후 재방문 유저 / 첫 방문 유저 | ≥ 40% |
| Lagging | 검색/비검색 분석 만족도 | NPS 또는 VOC 긍정 비율 | 긍정적 |
| Ultimate | 이탈율 기여 | Deep Layer 사용자 이탈율 vs 미사용자 | KR2 연결 |
5.4 Guard Rails (위반 시 롤백 검토)
- 기존 실험실 광고 분석 사용자 이탈 20% 초과 금지
- 캠페인 목록/상세 페이지 로딩 3초 초과 금지
- "데이터 없음" 표시 비율 20% 초과 금지
- API 에러율 1% 초과 금지
5.5 성공 판단 기준
[Sprint 종료 시점]
✅ 성공: Deep Layer 진입률 +50% AND 검색/비검색 탭 사용률 ≥ 30%
⚠️ 부분 성공: 둘 중 하나만 달성
❌ 실패: 둘 다 미달성 OR Guard Rails 위반
[Sprint +2주 후]
✅ 가설 검증: Deep Layer 리텐션 ≥ 40%
→ "검색/비검색 분리 분석이 중수 셀러의 상세 의사결정을 지원했다"6. 이벤트 트래킹 명세
6.1 이벤트 목록
| 이벤트명 | 트리거 시점 | 우선순위 |
|---|---|---|
view_ad_dashboard | Deep Layer 캠페인 목록 진입 | P0 |
view_campaign_detail | 캠페인 상세 진입 | P0 |
click_ad_type_tab | 검색/비검색 탭 클릭 | P0 |
change_period_filter | 기간 필터 변경 | P0 |
change_sort_option | 정렬 옵션 변경 | P1 |
click_campaign_item | 캠페인 목록에서 상세 클릭 | P1 |
export_data | 데이터 다운로드 | P2 |
6.2 핵심 이벤트 상세
view_ad_dashboard
javascript
dataLayer.push({
event: "ad_analysis",
event_name: "view_ad_dashboard",
params: {
source: "gnb", // gnb | surface_layer | direct
campaign_count: 5, // 표시된 캠페인 수
period: "7d", // 7d | 14d | 30d | custom
has_search_data: "Y",
has_nonsearch_data: "Y",
is_demo: "N"
}
});view_campaign_detail
javascript
dataLayer.push({
event: "ad_analysis",
event_name: "view_campaign_detail",
params: {
campaign_id: "camp_12345",
campaign_name: "봄 신상품",
source: "campaign_list", // campaign_list | surface_layer
period: "7d",
has_search_data: "Y",
has_nonsearch_data: "Y",
total_spend: 234567,
total_revenue: 1220000,
roas: 520,
is_demo: "N"
}
});click_ad_type_tab
javascript
dataLayer.push({
event: "ad_analysis",
event_name: "click_ad_type_tab",
params: {
campaign_id: "camp_12345",
tab: "non_search", // all | search | non_search
previous_tab: "all",
period: "7d",
search_roas: 520,
nonsearch_roas: 180,
is_demo: "N"
}
});change_period_filter
javascript
dataLayer.push({
event: "ad_analysis",
event_name: "change_period_filter",
params: {
page: "campaign_list", // campaign_list | campaign_detail
previous_period: "7d",
new_period: "30d", // 7d | 14d | 30d | custom
custom_start: null, // custom인 경우만
custom_end: null, // custom인 경우만
is_demo: "N"
}
});change_sort_option
javascript
dataLayer.push({
event: "ad_analysis",
event_name: "change_sort_option",
params: {
sort_by: "roas", // roas | spend | profit | revenue
sort_order: "asc", // asc | desc
campaign_count: 5,
is_demo: "N"
}
});6.3 측정 타이밍
| 시점 | 확인 항목 |
|---|---|
| 릴리즈 D+3 | 이벤트 수집 정상 여부, source 파라미터 정확성 |
| 릴리즈 D+7 | Primary 지표 초기값 (진입률, 탭 사용률) |
| 릴리즈 D+14 | 전체 KPI 1차 판정, Guard Rails 점검 |
| 릴리즈 D+21 | Lagging 지표 확인 (리텐션) |
7. 개발 범위 및 우선순위
7.1 P0 (필수, MVP)
| 항목 | 설명 | 담당 |
|---|---|---|
| GNB 메뉴 승격 | 실험실 → 정식 "광고 분석" 메뉴 | FE |
| 검색/비검색 분리 API | 캠페인별 검색/비검색 지표 조회 | BE |
| 검색/비검색 탭 UI | 캠페인 상세에 탭 추가 | FE |
| 지표 비교 테이블 | 검색 vs 비검색 지표 테이블 | FE |
| Surface → Deep 연결 | "상세 보기" 클릭 시 Deep Layer 이동 | FE |
7.2 P1 (중요)
| 항목 | 설명 | 담당 |
|---|---|---|
| 기간 필터 | 7일/14일/30일/커스텀 선택 | FE + BE |
| 정렬 옵션 | ROAS/광고비/순이익별 정렬 | FE |
| 이벤트 트래킹 | 6개 이벤트 DataLayer 전송 | FE |
| 모바일 반응형 | 테이블 → 카드 리스트 | FE |
| 데이터 없음 처리 | 비검색 데이터 없음 시 안내 | FE |
7.3 P2 (선택)
| 항목 | 설명 | 담당 |
|---|---|---|
| 추이 차트 | 기간별 ROAS/광고비 추이 | FE |
| 캠페인 비교 | 2개 캠페인 병렬 비교 | FE + BE |
| 데이터 내보내기 | CSV/Excel 다운로드 | FE + BE |
| 검색/비검색 필터 | 목록에서 검색만/비검색만 필터 | FE |
8. 의존성 & 제약
기술 의존성
| 의존 항목 | 상태 | 비고 |
|---|---|---|
| 비검색 광고 데이터 수집 | ✅ ETL 완료 | 창훈 수석 작업, 개발서버 배포됨 |
| CoupangAdKeywordDaily 테이블 | ✅ 확인됨 | 검색 광고 데이터 |
제약 조건
- 레포:
sellerking-web(메인 앱) - 기존 UI: 현재 실험실 광고 대시보드 UI 기반 확장
- 데이터: CALCULATED 상태 데이터만 표시
확인 필요 사항
| 항목 | 담당 | 상태 |
|---|---|---|
| 비검색 광고 데이터 수집 현황 | 창훈 수석 | ✅ ETL 완료, 개발서버 배포됨 |
| 검색/비검색 분리 API 설계 | 하록 | ✅ DB 컬럼 존재 확인됨 |
9. 스토리 목록 (예정)
Epic Spec 승인 후 분해
| Story ID | 제목 | 규모 | 우선순위 | 담당 | 상태 |
|---|---|---|---|---|---|
| E-02-S-01 | GNB 메뉴 구조 변경 (실험실 → 정식) | M | P0 | FE | draft |
| E-02-S-02 | 검색/비검색 분리 API 개발 | L | P0 | BE | draft |
| E-02-S-03 | 캠페인 상세 검색/비검색 탭 UI + 지표 비교 테이블 | M | P0 | FE | draft |
| E-02-S-04 | Surface → Deep 연결 | S | P0 | FE | draft |
| E-02-S-05 | 기간 필터 기능 (7일/14일/30일/커스텀) | S | P1 | FE+BE | draft |
| E-02-S-06 | 캠페인 목록 정렬/필터 옵션 | S | P1 | FE | draft |
| E-02-S-07 | GA4 이벤트 트래킹 (7개 이벤트) | S | P1 | FE | draft |
| E-02-S-08 | 모바일 반응형 (테이블 → 카드) | M | P1 | FE | draft |
Story Point 추정
| 규모 | Story | 합계 |
|---|---|---|
| L (3pt) | S-02 | 3 |
| M (2pt) | S-01, S-03, S-08 | 6 |
| S (1pt) | S-04, S-05, S-06, S-07 | 4 |
| 총합 | 13 SP |
의존성 그래프
[BE] E-02-S-02 검색/비검색 API
│
┌────┴────┬──────────────┐
▼ ▼ ▼
[FE] S-03 [FE] S-01 [FE] S-05
탭 UI 메뉴 승격 기간 필터
│
├───────────┬────────────┐
▼ ▼ ▼
[FE] S-04 [FE] S-06 [FE] S-07
Surface연결 정렬/필터 이벤트트래킹10. QA 체크리스트
기능 테스트
메뉴 승격
- [ ] GNB에 "광고 분석" 메뉴 노출
- [ ] 메뉴 클릭 시 Deep Layer 캠페인 목록 이동
- [ ] 실험실 메뉴에서 광고 분석 제거 또는 리다이렉트
캠페인 목록
- [ ] 연동된 모든 캠페인 목록 표시
- [ ] 캠페인별 광고비/매출/순이익/ROAS 표시
- [ ] 정렬 옵션 (ROAS/광고비/순이익) 동작
- [ ] 캠페인 클릭 시 상세 페이지 이동
- [ ] 모바일에서 반응형 (테이블 → 카드)
캠페인 상세
- [ ] 캠페인 정보 정상 표시
- [ ] 뒤로가기 버튼 동작
- [ ] 탭 메뉴 (키워드별/상품별/검색·비검색 영역/SKU단위) 표시
검색/비검색 탭
- [ ] 검색/비검색 영역 탭 클릭 시 비교 테이블 표시
- [ ] 비교 지표: 노출/클릭/CTR/전환/CVR/광고비/매출/ROAS/순이익/CPC
- [ ] 검색 데이터만 있을 때 비검색 "데이터 없음" 표시
- [ ] 비검색 데이터만 있을 때 검색 "데이터 없음" 표시
- [ ] 추이 차트 정상 표시 (P2)
기간 필터
- [ ] 7일/14일/30일 선택 가능
- [ ] 커스텀 날짜 범위 선택 가능
- [ ] 기간 변경 시 데이터 갱신
- [ ] 선택한 기간 유지 (페이지 이동 시)
Surface → Deep 연결
- [ ] Surface Layer "상세 보기" 클릭 시 Deep Layer 이동
- [ ] 해당 캠페인 상세 페이지로 직접 이동
- [ ] source 파라미터 "surface_layer" 전달
계산 로직 테스트
- [ ] ROAS = 전환매출 / 광고비 × 100
- [ ] CTR = 클릭수 / 노출수 × 100
- [ ] CVR = 전환수 / 클릭수 × 100
- [ ] CPC = 광고비 / 클릭수
- [ ] 순이익 = 전환매출 - 원가 - 광고비×1.1
- [ ] 검색/비검색 분리 집계 정확성
이벤트 트래킹 테스트
- [ ] view_ad_dashboard 이벤트 발생
- [ ] view_campaign_detail 이벤트 발생
- [ ] click_ad_type_tab 이벤트 발생
- [ ] change_period_filter 이벤트 발생
- [ ] change_sort_option 이벤트 발생
- [ ] 파라미터 (source, period, tab 등) 정확성
- [ ] GA4 DebugView에서 확인
엣지 케이스 테스트
데이터 예외
- [ ] 비검색 광고 데이터 없음 → 안내 메시지
- [ ] 검색 광고만 운영 → 비검색 탭 "데이터 없음"
- [ ] 기간 내 데이터 0건 → "선택한 기간에 광고 데이터가 없습니다"
- [ ] 원가 미입력 → ROAS만 표시, 순이익 "-"
사용자 예외
- [ ] 광고 연동 미완료 → "광고를 연동해주세요" 안내
- [ ] 모바일 접속 → 반응형 디자인
시스템 예외
- [ ] ETL 미완료 (state != CALCULATED) → "데이터 계산 중" 표시
- [ ] API 타임아웃 → "잠시 후 다시 시도해주세요" + 재시도 버튼
- [ ] 페이지 로딩 3초 이내 확인
체크리스트
PO 승인 전 체크
- [x] 문제 정의가 명확한가?
- [x] 비즈니스 로직이 구체적인가?
- [x] 와이어프레임/플로우가 있는가?
- [x] 엣지 케이스가 정의되었는가?
- [x] 성공 지표가 측정 가능한가?
- [ ] 기술 의존성이 확인되었는가? (비검색 데이터 확인 필요)
미결 사항
| 항목 | 상태 | 담당 |
|---|---|---|
| 비검색 광고 데이터 현황 확인 | ⏳ 창훈 수석님께 확인 필요 | 윤재 |
| 디자인 요청 | ⏳ 스프린트 시작 전 전달 예정 | 윤재 |
승인
| 항목 | 확인 |
|---|---|
| PO 승인 | ✅ |
| 승인일 | 2026-01-20 |
| 비고 | 자동/수동 구분 컬럼 DB에 존재 확인됨 |
변경 이력
| 날짜 | 변경 내용 | 담당 |
|---|---|---|
| 2026-01-19 | Epic Spec 초안 작성 | 윤재 |
| 2026-01-20 | PO 승인 | 윤재 |
| 2026-01-22 | 요약 영역/Status Badge 제거 (Phase 2 순차 적용) | 윤재 |
| 2026-01-23 | Notion PRD 수준 상세화 (검색/비검색 지표 비교 상세, 성공 지표 체계, 이벤트 트래킹 명세, 개발 범위 분류, QA 체크리스트) | 윤재 |
작성일: 2026-01-19최종 수정: 2026-01-23 (Notion PRD 수준 상세화)
