테마
Story: 프리미엄 게이트 (요금제 분기)
메타
| 항목 | 값 |
|---|---|
| Story ID | E-04-S-03 |
| Epic | E-04 AI 진단 엔진 |
| 상태 | draft |
| 우선순위 | P0 |
| 규모 | S |
| 담당 개발자 | BE (하록님) |
사용자 스토리
As a 장사왕 시스템, I want 요금제에 따라 AI/규칙 기반 진단을 분기, So that Pro10+ 고객에게만 프리미엄 AI 진단을 제공할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: 요금제 확인
| 항목 | 내용 |
|---|---|
| Given | 진단 API 요청 |
| When | 요금제 확인 |
| Then | 하위 요금제 → 규칙 기반, 상위 요금제 → AI 진단 |
요금제 분기 (AS-IS vs TO-BE):
⚠️ E-05 요금제 정책 재설계가 적용되면 TO-BE로 전환 필요
| 구분 | 규칙 기반 (source: "rule") | AI 진단 (source: "ai") |
|---|---|---|
| AS-IS (현재) | basic1, pro3 | pro10, pro20, pro50, enterprise |
| TO-BE (E-05 적용 후) | Starter, Basic | Pro, Business |
분기 기준:
- AS-IS:
pro10이상 = AI 진단 - TO-BE:
Pro이상 (tierId >= 3) = AI 진단
AC-02: AI 진단 가능 플래그
| 항목 | 내용 |
|---|---|
| Given | Surface Layer 데이터 조회 |
| When | 응답 생성 |
| Then | aiDiagnosisEnabled: boolean 플래그 포함 |
용도: FE에서 AI 업그레이드 유도 배너 표시 여부 결정
AC-03: 다운그레이드 처리
| 항목 | 내용 |
|---|---|
| Given | AI 진단 가능 → 불가능 요금제로 다운그레이드 |
| When | 진단 요청 |
| Then | 규칙 기반으로 자동 전환, 기존 AI 캐시 무효화 |
다운그레이드 시나리오:
| 구분 | AS-IS | TO-BE |
|---|---|---|
| 예시 | pro10 → pro3 | Pro → Basic |
| 결과 | AI → 규칙 기반 전환 | AI → 규칙 기반 전환 |
태스크 분해
Task 1: 요금제 확인 로직 AC-01
- [ ] 1.1: 현재 요금제 조회 함수 확인/활용
- [ ] 1.2: AI 진단 가능 요금제 목록 정의
- [ ] 1.3: 분기 로직 구현
Task 2: API 응답 플래그 AC-02
- [ ] 2.1:
aiDiagnosisEnabled필드 추가 - [ ] 2.2: Surface Layer 응답에 포함
Task 3: 다운그레이드 처리 AC-03
- [ ] 3.1: 요금제 변경 이벤트 감지 (또는 실시간 확인)
- [ ] 3.2: 캐시 무효화 로직
Task 4: 테스트
- [ ] 4.1: 요금제별 분기 테스트
- [ ] 4.2: 다운그레이드 시나리오 테스트
Dev Notes (AI Agent 최적화)
영향 받는 소스 트리
src/
├── campaigns/
│ └── diagnosis/
│ └── diagnosis.service.ts # 🔧 수정 (분기 로직)
├── billing/
│ └── plan.service.ts # 참조 (요금제 조회)
└── common/
└── guards/
└── premium-feature.guard.ts # 🆕 또는 기존 활용요금제 상수 정의 (AS-IS / TO-BE)
typescript
// ============================================================
// AS-IS: 현재 요금제 기준 (E-05 적용 전)
// ============================================================
const AI_DIAGNOSIS_PLANS_LEGACY = [
'pro10',
'pro20',
'pro50',
'enterprise'
];
function isAIDiagnosisEnabledLegacy(planType: string): boolean {
// planType 예: 'pro10_monthly', 'pro3_yearly' 등
const basePlan = planType.split('_')[0].toLowerCase();
return AI_DIAGNOSIS_PLANS_LEGACY.some(p => basePlan.startsWith(p));
}
// ============================================================
// TO-BE: E-05 요금제 정책 적용 후
// ============================================================
const AI_DIAGNOSIS_TIER_IDS = [3, 4]; // Pro(3), Business(4)
function isAIDiagnosisEnabled(tierId: number): boolean {
return AI_DIAGNOSIS_TIER_IDS.includes(tierId);
}
// 또는 티어명 기반
const AI_DIAGNOSIS_TIERS = ['pro', 'business'];
function isAIDiagnosisEnabledByTier(tierCode: string): boolean {
return AI_DIAGNOSIS_TIERS.includes(tierCode.toLowerCase());
}전환 시점: E-05-S-08 (마이그레이션) 완료 후 TO-BE 로직으로 전환
충돌 감지
| 항목 | 상태 | 설명 |
|---|---|---|
| 기존 코드 충돌 | ✅ 낮음 | 기존 요금제 로직 활용 |
| DB 스키마 변경 | ✅ 없음 |
의존성
| 의존 | 설명 | 상태 |
|---|---|---|
| 요금제 시스템 | 현재 요금제 조회 가능 | ✅ 존재 |
| E-05 요금제 정책 | TO-BE 분기 로직에 필요 | 🔄 S53 진행 중 |
E-05 연동 전략
[배포 순서]
1. E-04-S-03 AS-IS 로직으로 먼저 배포 (pro10+ 기준)
2. E-05-S-08 마이그레이션 완료
3. E-04-S-03 TO-BE 로직으로 업데이트 (tierId 기준)
[Feature Flag 권장]
USE_NEW_TIER_SYSTEM=true 환경변수로 분기 전환 가능하게 구현Grandfather 고객 처리
E-05 적용 후에도 Grandfather 고객(기존 PortOne 결제)은 기존 planType 기준으로 판단:
- Grandfather + pro10 이상 → AI 진단 ✅
- Grandfather + pro3 → 규칙 기반 (기존 요금제 유지이므로)
Dev Agent Record
| 항목 | 값 |
|---|---|
| 생성 Agent | Claude Opus 4.5 |
| 생성일 | 2026-01-27 |
| 마지막 수정 | 2026-01-27 |
| 검증자 | - |
검증 결과: 🔄 PENDING (PO 승인 대기) 검증일: -
생성일: 2026-01-27마지막 수정: 2026-01-27
