Skip to content

Story: 기존 데이터 마이그레이션 스크립트

메타

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

사용자 스토리

As a 장사왕 시스템, I want 기존 요금제 데이터를 새 티어 구조로 마이그레이션, So that 서비스 중단 없이 새 요금제 체계를 적용할 수 있다.


수락 기준 (Acceptance Criteria)

AC-01: 기존 요금제 → 새 티어 매핑

항목내용
Given기존 RatePlan/BizPlanInfo 데이터
When마이그레이션 스크립트 실행
Then새 PlanTier로 매핑

매핑 테이블:

기존 planType새 tierId티어명비고
basic1_*1Starter무료/체험
pro3_*2Basic
pro10_*3Pro
pro20_*4Business
Trial/무료1Starter기본값

AC-02: BizPlanInfo 확장

항목내용
GivenBizPlanInfo 테이블
When마이그레이션
ThentierId, 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 플래그 설정

항목내용
GivenPortOne PG 사용 고객
When마이그레이션
ThenisGrandfather = 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-01PlanTier 테이블선행 필수

이 Story가 블로킹하는 Story:

  • E-05-S-02 (마이그레이션 완료 후 서비스 사용 가능)

주의사항

⚠️ 프로덕션 배포 시:

  1. 반드시 백업 후 실행
  2. 점검 시간 확보 (15~30분)
  3. 롤백 스크립트 테스트 완료 후 배포
  4. 마이그레이션 후 서비스 정상 확인

생성일: 2026-01-27

장사왕 Product Team