Skip to content

Story: PlanTier/PlanFeature 테이블 설계 및 생성

메타

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

사용자 스토리

As a 장사왕 시스템, I want 요금제 정책을 DB 테이블로 관리, So that 코드 수정 없이 정책을 변경하고 가드레일을 적용할 수 있다.


수락 기준 (Acceptance Criteria)

AC-01: PlanTier 테이블 생성

항목내용
Given새 요금제 정책 확정
When마이그레이션 실행
ThenPlanTier 테이블 생성 + 4개 티어 데이터

테이블 스키마:

sql
CREATE TABLE PlanTier (
  id INT PRIMARY KEY AUTO_INCREMENT,
  code VARCHAR(20) NOT NULL UNIQUE,    -- 'starter', 'basic', 'pro', 'business'
  name VARCHAR(50) NOT NULL,           -- 'Starter', 'Basic', 'Pro', 'Business'
  monthlyPrice DECIMAL(10,0) NOT NULL, -- 33000, 55000, 110000, 330000
  maxVendors INT NOT NULL,             -- 1, 3, 15, 50
  maxMonthlyOrders INT,                -- 2000, 5000, 30000, NULL(무제한)
  dataRetentionDays INT NOT NULL,      -- 7, 30, 90, 365
  displayOrder INT NOT NULL,           -- 정렬 순서
  isActive BOOLEAN DEFAULT TRUE,
  createdAt TIMESTAMP DEFAULT NOW(),
  updatedAt TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
);

초기 데이터:

codenamemonthlyPricemaxVendorsmaxMonthlyOrdersdataRetentionDays
starterStarter33000120007
basicBasic550003500030
proPro110000153000090
businessBusiness33000050NULL365

AC-02: PlanFeature 테이블 생성

항목내용
GivenPlanTier 테이블 존재
WhenFeature 제한 정책 적용
Then요금제별 Feature 제한 조회 가능

테이블 스키마:

sql
CREATE TABLE PlanFeature (
  id INT PRIMARY KEY AUTO_INCREMENT,
  planTierId INT NOT NULL,
  featureCode VARCHAR(50) NOT NULL,    -- 'deep_layer_campaigns', 'keywords', etc.
  limitType ENUM('boolean', 'count') NOT NULL,
  limitValue INT NOT NULL,             -- boolean: 0/1, count: 숫자
  createdAt TIMESTAMP DEFAULT NOW(),
  updatedAt TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
  FOREIGN KEY (planTierId) REFERENCES PlanTier(id),
  UNIQUE KEY (planTierId, featureCode)
);

Feature 코드 정의:

featureCode설명limitType
deep_layer_campaignsDeep Layer 캠페인 수count
keywords키워드 분석 수count
ai_diagnosisAI 진단boolean
worknote_record업무노트 적용 기록boolean
worknote_memo업무노트 커스텀 메모boolean
worknote_tracking업무노트 효과 추적boolean
csv_exportCSV 내보내기boolean

AC-03: Feature 제한 초기 데이터

항목내용
GivenPlanTier, PlanFeature 테이블 존재
When쿼리 실행
Then요금제별 Feature 제한 반환

초기 데이터 매트릭스:

FeatureStarterBasicProBusiness
deep_layer_campaigns110309999
keywords310509999
ai_diagnosis0011
worknote_record0111
worknote_memo0011
worknote_tracking0011
csv_export0011

태스크 분해

Task 1: PlanTier 테이블 AC-01

  • [ ] 1.1: 마이그레이션 파일 생성
  • [ ] 1.2: PlanTier 테이블 생성 쿼리
  • [ ] 1.3: 4개 티어 초기 데이터 INSERT
  • [ ] 1.4: 인덱스 생성 (code UNIQUE)

Task 2: PlanFeature 테이블 AC-02

  • [ ] 2.1: PlanFeature 테이블 생성 쿼리
  • [ ] 2.2: FK 제약조건 설정
  • [ ] 2.3: 복합 유니크 인덱스 (planTierId, featureCode)

Task 3: 초기 데이터 AC-03

  • [ ] 3.1: Feature 제한 데이터 INSERT (7개 Feature × 4개 티어 = 28행)
  • [ ] 3.2: 데이터 검증 쿼리 작성

Task 4: Entity 및 Repository

  • [ ] 4.1: PlanTier Entity 생성
  • [ ] 4.2: PlanFeature Entity 생성
  • [ ] 4.3: PlanTierRepository 생성
  • [ ] 4.4: PlanFeatureRepository 생성

Task 5: 테스트

  • [ ] 5.1: 마이그레이션 롤백 테스트
  • [ ] 5.2: Repository 단위 테스트

Dev Notes (AI Agent 최적화)

영향 받는 소스 트리

src/
├── entity/
│   ├── plan-tier.entity.ts           # 🆕
│   └── plan-feature.entity.ts        # 🆕
├── repository/
│   ├── plan-tier.repository.ts       # 🆕
│   └── plan-feature.repository.ts    # 🆕
└── migration/
    └── YYYYMMDD-create-plan-tables.ts # 🆕

database/
└── seed/
    └── plan-tier-seed.sql            # 🆕

기존 RatePlan과의 관계

[AS-IS]
RatePlan (복잡한 가격 계산, Feature 없음)

[TO-BE]
PlanTier (단순 요금제 정의)
  └── PlanFeature (Feature별 제한)

[마이그레이션]
기존 RatePlan은 유지 (Grandfather용)
신규 가입은 PlanTier 참조

충돌 감지

항목상태설명
기존 코드 충돌✅ 없음신규 테이블
RatePlan 테이블🟡 공존기존 유지, 새 테이블 추가

의존성

의존설명상태
없음첫 번째 Story-

이 Story가 블로킹하는 Story:

  • E-05-S-02 (가드레일 체크 서비스)
  • E-05-S-08 (마이그레이션 스크립트)
  • E-05-S-09 (Grandfather 정책)

Dev Agent Record

항목
생성 AgentClaude Opus 4.5
생성일2026-01-27
마지막 수정2026-01-27
검증자-

생성일: 2026-01-27

장사왕 Product Team