Skip to content

Story: CSV Export 요금제 체크

메타

항목
Story IDE-05-S-07
EpicE-05 요금제 정책 재설계 및 가드레일
상태draft
우선순위P1
규모S
담당창훈님 (하록님, 수민님)

사용자 스토리

As a Pro 요금제 셀러, I want 캠페인 데이터를 CSV로 내보내고 싶다, So that 자체 분석이나 보고서 작성에 활용할 수 있다.


수락 기준 (Acceptance Criteria)

AC-01: BE - CSV Export 요금제 체크

항목내용
GivenCSV Export API 요청
When요금제 확인
ThenPro/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 버튼 상태 분기

항목내용
GivenDeep Layer 캠페인 상세 화면
When요금제 확인
ThenPro+는 활성, Starter/Basic은 잠금

UI 스펙 - Starter/Basic:

┌────────────────────────────────────────┐
│ [CSV 내보내기 🔒]                       │
│                                        │
│ ┌────────────────────────────────────┐ │
│ │ Pro 요금제부터 사용 가능            │ │
│ │           [업그레이드]             │ │
│ └────────────────────────────────────┘ │
└────────────────────────────────────────┘

UI 스펙 - Pro/Business:

┌────────────────────────────────────────┐
│ [CSV 내보내기 ⬇️]                       │
└────────────────────────────────────────┘

AC-03: Export 성공 시 GA 이벤트

항목내용
GivenCSV Export 완료
When다운로드 성공
ThenGA4 이벤트 전송

이벤트 스펙:

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-02PlanGuardService선행 필수

생성일: 2026-01-27

장사왕 Product Team