테마
Story: 기존 데이터 마이그레이션 스크립트
메타
| 항목 | 값 |
|---|---|
| Story ID | E-05-S-08 |
| Epic | E-05 요금제 정책 재설계 및 가드레일 |
| 상태 | draft |
| 우선순위 | P0 |
| 규모 | M |
| 담당 | 창훈님 (하록님, 수민님) |
사용자 스토리
As a 장사왕 시스템, I want 기존 요금제 데이터를 새 티어 구조로 마이그레이션, So that 서비스 중단 없이 새 요금제 체계를 적용할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: 기존 요금제 → 새 티어 매핑
| 항목 | 내용 |
|---|---|
| Given | 기존 RatePlan/BizPlanInfo 데이터 |
| When | 마이그레이션 스크립트 실행 |
| Then | 새 PlanTier로 매핑 |
매핑 테이블:
| 기존 planType | 새 tierId | 티어명 | 비고 |
|---|---|---|---|
basic1_* | 1 | Starter | 무료/체험 |
pro3_* | 2 | Basic | |
pro10_* | 3 | Pro | |
pro20_* | 4 | Business | |
| Trial/무료 | 1 | Starter | 기본값 |
AC-02: BizPlanInfo 확장
| 항목 | 내용 |
|---|---|
| Given | BizPlanInfo 테이블 |
| When | 마이그레이션 |
| Then | tierId, isGrandfather 컬럼 추가 |
스키마 변경:
sql
ALTER TABLE BizPlanInfo
ADD COLUMN tierId INT DEFAULT 1,
ADD COLUMN isGrandfather BOOLEAN DEFAULT FALSE,
ADD CONSTRAINT FK_BizPlanInfo_PlanTier
FOREIGN KEY (tierId) REFERENCES PlanTier(id);AC-03: Grandfather 플래그 설정
| 항목 | 내용 |
|---|---|
| Given | PortOne PG 사용 고객 |
| When | 마이그레이션 |
| Then | isGrandfather = TRUE |
판정 로직:
sql
-- PortOne PG 사용 중인 기존 결제 고객
UPDATE BizPlanInfo
SET isGrandfather = TRUE
WHERE paymentMethod = 'PORTONE'
AND planType NOT IN ('trial', 'free');AC-04: 롤백 가능
| 항목 | 내용 |
|---|---|
| Given | 마이그레이션 완료 |
| When | 문제 발생 |
| Then | 롤백 스크립트로 원복 |
태스크 분해
Task 1: 스키마 마이그레이션 AC-02
- [ ] 1.1: BizPlanInfo에 tierId 컬럼 추가
- [ ] 1.2: isGrandfather 컬럼 추가
- [ ] 1.3: FK 제약 조건 설정
Task 2: 데이터 마이그레이션 AC-01
- [ ] 2.1: planType → tierId 매핑 스크립트
- [ ] 2.2: 매핑되지 않는 케이스 처리 (기본값 Starter)
- [ ] 2.3: 마이그레이션 로그 테이블
Task 3: Grandfather 설정 AC-03
- [ ] 3.1: PortOne 사용 고객 추출
- [ ] 3.2: isGrandfather = TRUE 업데이트
- [ ] 3.3: 결과 검증 쿼리
Task 4: 롤백 스크립트 AC-04
- [ ] 4.1: 컬럼 롤백 스크립트
- [ ] 4.2: 데이터 롤백 스크립트
- [ ] 4.3: 롤백 테스트
Task 5: 검증
- [ ] 5.1: 마이그레이션 전후 고객 수 일치 확인
- [ ] 5.2: 티어별 분포 확인
- [ ] 5.3: Grandfather 고객 수 확인
Dev Notes (AI Agent 최적화)
마이그레이션 스크립트
sql
-- 1. 스키마 변경
ALTER TABLE BizPlanInfo
ADD COLUMN tierId INT DEFAULT 1,
ADD COLUMN isGrandfather BOOLEAN DEFAULT FALSE;
-- 2. 기존 데이터 매핑
UPDATE BizPlanInfo SET tierId = CASE
WHEN planType LIKE 'basic1_%' THEN 1 -- Starter
WHEN planType LIKE 'pro3_%' THEN 2 -- Basic
WHEN planType LIKE 'pro10_%' THEN 3 -- Pro
WHEN planType LIKE 'pro20_%' THEN 4 -- Business
ELSE 1 -- 기본값 Starter
END;
-- 3. Grandfather 플래그
UPDATE BizPlanInfo
SET isGrandfather = TRUE
WHERE paymentMethod = 'PORTONE'
AND planType NOT LIKE 'trial%'
AND planType NOT LIKE 'free%';
-- 4. FK 제약 조건 (데이터 매핑 후)
ALTER TABLE BizPlanInfo
ADD CONSTRAINT FK_BizPlanInfo_PlanTier
FOREIGN KEY (tierId) REFERENCES PlanTier(id);검증 쿼리
sql
-- 마이그레이션 결과 검증
SELECT
pt.tierCode,
pt.tierName,
COUNT(*) as customerCount,
SUM(CASE WHEN bp.isGrandfather THEN 1 ELSE 0 END) as grandfatherCount
FROM BizPlanInfo bp
JOIN PlanTier pt ON bp.tierId = pt.tierId
GROUP BY pt.tierId, pt.tierCode, pt.tierName
ORDER BY pt.tierId;롤백 스크립트
sql
-- 롤백
ALTER TABLE BizPlanInfo
DROP FOREIGN KEY FK_BizPlanInfo_PlanTier,
DROP COLUMN tierId,
DROP COLUMN isGrandfather;영향 받는 소스 트리
scripts/
└── migration/
├── 001_add_plan_tier_columns.sql # 🆕 스키마 변경
├── 002_migrate_plan_data.sql # 🆕 데이터 매핑
├── 003_set_grandfather_flag.sql # 🆕 Grandfather
└── rollback/
└── 001_rollback_plan_tier.sql # 🆕 롤백의존성
| 의존 | 설명 | 상태 |
|---|---|---|
| E-05-S-01 | PlanTier 테이블 | 선행 필수 |
이 Story가 블로킹하는 Story:
- E-05-S-02 (마이그레이션 완료 후 서비스 사용 가능)
주의사항
⚠️ 프로덕션 배포 시:
- 반드시 백업 후 실행
- 점검 시간 확보 (15~30분)
- 롤백 스크립트 테스트 완료 후 배포
- 마이그레이션 후 서비스 정상 확인
생성일: 2026-01-27
