테마
Story: CSV Export 요금제 체크
메타
| 항목 | 값 |
|---|---|
| Story ID | E-05-S-07 |
| Epic | E-05 요금제 정책 재설계 및 가드레일 |
| 상태 | draft |
| 우선순위 | P1 |
| 규모 | S |
| 담당 | 창훈님 (하록님, 수민님) |
사용자 스토리
As a Pro 요금제 셀러, I want 캠페인 데이터를 CSV로 내보내고 싶다, So that 자체 분석이나 보고서 작성에 활용할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: BE - CSV Export 요금제 체크
| 항목 | 내용 |
|---|---|
| Given | CSV Export API 요청 |
| When | 요금제 확인 |
| Then | Pro/Business는 허용, 나머지는 403 |
API 응답:
typescript
// Pro/Business
{
"success": true,
"data": "csv content..."
}
// Starter/Basic
{
"success": false,
"error": {
"code": "FEATURE_RESTRICTED",
"message": "CSV 내보내기는 Pro 요금제부터 사용 가능합니다.",
"upgradeRequired": "pro"
}
}AC-02: FE - Export 버튼 상태 분기
| 항목 | 내용 |
|---|---|
| Given | Deep Layer 캠페인 상세 화면 |
| When | 요금제 확인 |
| Then | Pro+는 활성, Starter/Basic은 잠금 |
UI 스펙 - Starter/Basic:
┌────────────────────────────────────────┐
│ [CSV 내보내기 🔒] │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Pro 요금제부터 사용 가능 │ │
│ │ [업그레이드] │ │
│ └────────────────────────────────────┘ │
└────────────────────────────────────────┘UI 스펙 - Pro/Business:
┌────────────────────────────────────────┐
│ [CSV 내보내기 ⬇️] │
└────────────────────────────────────────┘AC-03: Export 성공 시 GA 이벤트
| 항목 | 내용 |
|---|---|
| Given | CSV Export 완료 |
| When | 다운로드 성공 |
| Then | GA4 이벤트 전송 |
이벤트 스펙:
typescript
gtag('event', 'csv_export', {
event_category: 'feature_usage',
tier: 'pro',
export_type: 'campaign_detail',
row_count: 150
});태스크 분해
Task 1: BE - Export API 가드레일 AC-01
- [ ] 1.1: Export API에 PlanGuardService 주입
- [ ] 1.2: csv_export Feature 체크
- [ ] 1.3: 제한 시 403 + 업그레이드 안내 응답
Task 2: FE - Export 버튼 상태 AC-02
- [ ] 2.1: usePlanGuard로 csv_export Feature 체크
- [ ] 2.2: 잠금 상태 버튼 UI
- [ ] 2.3: 업그레이드 CTA 툴팁
Task 3: GA 이벤트 AC-03
- [ ] 3.1: Export 성공 시 GA4 이벤트 전송
- [ ] 3.2: 요금제 정보 포함
Dev Notes (AI Agent 최적화)
영향 받는 소스 트리
BE:
src/
├── controller/
│ └── export.controller.ts # 🔄 수정 (가드레일 추가)
└── service/
└── plan-guard.service.ts # (E-05-S-02)
FE:
src/
├── components/
│ ├── campaign/
│ │ └── CampaignExportButton.tsx # 🔄 수정 (상태 분기)
│ └── common/
│ └── LockedFeatureButton.tsx # 🆕 재사용 가능기존 Export 로직 확인
typescript
// 현재 Export API (가드레일 없음)
@Get('export')
async exportCampaigns(@Query() query: ExportQuery) {
return this.exportService.toCsv(query);
}
// 수정 후
@Get('export')
async exportCampaigns(@Query() query: ExportQuery, @User() user) {
const check = await this.planGuardService.checkFeatureAccess(
user.bizId,
'csv_export'
);
if (!check.allowed) {
throw new ForbiddenException({
code: 'FEATURE_RESTRICTED',
message: 'CSV 내보내기는 Pro 요금제부터 사용 가능합니다.',
upgradeRequired: check.upgradeRequired
});
}
return this.exportService.toCsv(query);
}의존성
| 의존 | 설명 | 상태 |
|---|---|---|
| E-05-S-02 | PlanGuardService | 선행 필수 |
생성일: 2026-01-27
