콘텐츠로 이동

마이그레이션 계획

로컬 DB 데이터를 웹 기반 신규 DB로 구조 변경 및 이관하는 전략 수립


구분원본주요 테이블대상데이터량 (추정)
고객 데이터C/S MSSQL (사내)PT_Customer (48 cols), PT_Company (49 cols)통합 DB (클라우드)__만 건 (VPN 접근 후 확인)
구독 데이터C/S MSSQL (사내)PT_Subscribe (20 cols), PT_Receiver (43 cols), PT_Giro통합 DB (클라우드)__만 건
결제/재무C/S MSSQL (사내)PT_Finance (22 cols), PT_Deposit, PT_DEFERINCOME_*통합 DB (클라우드)__만 건
상품/재고C/S MSSQL (사내)PT_Book (30 cols), PT_BookPrice, PT_Stock통합 DB (클라우드)__만 건
CS 이력C/S MSSQL (사내)PT_Councel_History, PT_SendHistory통합 DB (클라우드)__만 건
홈페이지 주문AWS MSSQLPTM_Orders, PTM_Order_Items, PTM_Regular_Orders (63t)통합 DB (클라우드)__만 건
CMS 콘텐츠AWS MSSQLptcms_contents (33 cols), ptcms_writer, ptcms_books (13t)통합 DB (클라우드)__만 건
SP/Trigger 로직C/S MSSQL (사내)20 SPs + 14 Functions + 15 Triggers애플리케이션 코드로 전환49개 객체
graph TD
    A["마이그레이션 전략"]
    
    A --> B["1단계: 준비"]
    B --> B1["소스 데이터 분석"]
    B --> B2["매핑 테이블 작성"]
    B --> B3["ETL 스크립트 개발"]
    
    A --> C["2단계: 테스트 이관"]
    C --> C1["샘플 데이터 이관"]
    C --> C2["검증 및 수정"]
    C --> C3["반복 테스트"]
    
    A --> D["3단계: 본 이관"]
    D --> D1["전체 데이터 이관"]
    D --> D2["정합성 검증"]
    D --> D3["차이 데이터 동기화"]
    
    A --> E["4단계: 전환"]
    E --> E1["신규 시스템 오픈"]
    E --> E2["기존 시스템 폐쇄"]
    E --> E3["병행 운영 기간 종료"]
    
    style A fill:#e3f2fd
    style B fill:#f3e5f5
    style C fill:#f3e5f5
    style D fill:#f3e5f5
    style E fill:#f3e5f5

AS-IS (MSSQL)TO-BE (통합 DB)변환 규칙
PT_Customer (48 cols)customersCustomer_ID(decimal13)→customer_code, 연락처 정규화, 이름 공백제거
PT_Subscribe (20 cols)subscriptionsCustomer_ID+Subscribe_SN 복합키 → 단일 PK, 상태코드 표준화
PT_Receiver (43 cols)delivery_addresses + order_items받는사람 정보 분리: 배송지 + 주문항목
PT_Finance (22 cols)paymentsFinance_Type별 입금/환불 분리, 나이스페이 코드 매핑
PT_Company (49 cols)partnersCompany_CD→partner_code
PT_Book + PT_BookPriceproducts도서+가격 통합, Book_SQ→product_code
PT_Stock + PT_GiftStockinventory일반재고+선물재고 통합
PT_Councel_Historycs_tickets + cs_histories상담이력 → 티켓+처리이력 분리
PT_Giropayment_giro지로 결제 정보 이관
PT_GiftSendgift_orders선물발송 → 선물주문
PT_DEFERINCOME_INFO/MST/STATdeferred_revenues선수수익 3테이블 통합
PTM_Products + PTM_ProductOptionsproducts (병합)홈페이지 상품 → C/S 도서와 통합 상품 테이블
PTM_Orders + PTM_Order_Itemsorders + order_items홈페이지 주문 이관
PTM_Regular_Orders + PTM_Regularssubscriptions (병합)웹 정기구독 → C/S 구독과 통합
PTM_Coupons + PTM_Coupon_*coupons + coupon_histories쿠폰 통합
ptcms_contents + ptcms_writercms_contents + cms_writersCMS 콘텐츠 이관 (33 cols 정리)
ptcms_booksproducts (카테고리 병합)CMS 도서 → 상품 통합
AS-IS 필드TO-BE 필드타입 변환데이터 변환
Customer_ID (decimal 13)customer_codeDECIMAL→VARCHAR문자열 변환, 앞 0 패딩
Customer_NMnameNVARCHAR→VARCHAR공백 제거, 특수문자 정리
Tel_NOphoneVARCHAR→VARCHAR숫자만 추출 (func_GetNumeric 참조)
Subscribe_DTstart_dateDATETIME→TIMESTAMPUTC 변환
Finance_SQpayment_idINT→BIGINT자동 증분
Book_SQproduct_codeINT→VARCHAR상품코드 체계 변환
Company_CDpartner_codeVARCHAR→VARCHAR코드 체계 통일

-- C/S MSSQL에서 고객 데이터 추출 예시
SELECT
Customer_ID, -- decimal(13) PK
Customer_NM, -- nvarchar 고객명
Tel_NO, -- varchar 연락처
HP_NO, -- varchar 휴대폰
Email, -- varchar 이메일
Reg_DT, -- datetime 등록일
Customer_Type, -- 고객유형 코드
Subscribe_YN -- 구독여부
FROM PT_Customer
WHERE Del_YN = 'N'
AND Customer_ID IS NOT NULL
# 변환 로직 예시 (Python)
def transform_customer(row):
return {
'customer_code': str(int(row['Customer_ID'])).zfill(13), # decimal(13) → 문자열 변환
'name': row['Customer_NM'].strip() if row['Customer_NM'] else '',
'phone': re.sub(r'\D', '', row['Tel_NO'] or ''), # func_GetNumeric 참조
'mobile': re.sub(r'\D', '', row['HP_NO'] or ''),
'email': row['Email'].lower().strip() if row['Email'] else None,
'customer_type': map_customer_type(row['Customer_Type']), # 코드 변환
'is_subscriber': row['Subscribe_YN'] == 'Y',
'created_at': row['Reg_DT'].replace(tzinfo=timezone.utc)
}
def map_customer_type(code):
"""PT_CodeDetail 기반 고객유형 코드 매핑"""
TYPE_MAP = {
'01': 'individual', # 개인
'02': 'corporate', # 법인/단체
'03': 'school', # 학교/기관
}
return TYPE_MAP.get(code, 'unknown')
-- TO-BE 통합 DB에 데이터 적재 (PostgreSQL 예시)
INSERT INTO customers (
customer_code, name, phone, mobile, email,
customer_type, is_subscriber, created_at
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
ON CONFLICT (customer_code) DO UPDATE SET
name = EXCLUDED.name,
phone = EXCLUDED.phone,
mobile = EXCLUDED.mobile,
email = EXCLUDED.email,
customer_type = EXCLUDED.customer_type,
is_subscriber = EXCLUDED.is_subscriber,
updated_at = NOW();

테이블AS-IS 건수TO-BE 건수차이원인
고객
주문
CS
-- 합계 검증 예시
-- AS-IS (C/S MSSQL)
SELECT COUNT(*) AS cnt, SUM(Finance_AMT) AS total_amt
FROM PT_Finance
WHERE YEAR(Finance_DT) = 2024 AND Finance_Type IN ('입금','카드');
-- TO-BE (통합 DB)
SELECT COUNT(*) AS cnt, SUM(amount) AS total_amt
FROM payments
WHERE EXTRACT(YEAR FROM payment_date) = 2024
AND payment_type IN ('deposit', 'card');
  • 무작위 샘플 100건 추출
  • 원본-대상 1:1 대조
  • 불일치 항목 분석

flowchart LR
    A["기존 시스템 운영"] --> B["일시 중단<br/>4시간"]
    B --> C["데이터 이관"]
    C --> D["신규 시스템 오픈"]
    
    style A fill:#fff9c4
    style B fill:#ffccbc
    style C fill:#ffccbc
    style D fill:#c8e6c9

장점: 전환 기간 짧음, 단순함
단점: 리스크 높음, 롤백 어려움

flowchart LR
    A["기존 시스템"] --> B["병행 운영<br/>1주"]
    B --> C["종료"]
    
    D["신규 시스템"] --> B
    B --> E["단독 운영"]
    
    style A fill:#fff9c4
    style D fill:#c8e6c9
    style B fill:#b3e5fc
    style E fill:#c8e6c9
    style C fill:#ffccbc

장점: 리스크 분산, 롤백 가능
단점: 병행 운영 부담


상황조치
데이터 정합성 90% 미만이관 중단, 원인 분석
주요 기능 오류기존 시스템 복귀
성능 기준 미달기존 시스템 복귀
  1. 신규 시스템 접근 차단
  2. 기존 시스템 재활성화
  3. 변경 데이터 역이관 (Delta)
  4. 원인 분석 및 재이관 계획

단계기간활동
준비1주매핑 테이블, ETL 개발
테스트1주샘플 이관, 검증, 수정
본 이관1일전체 데이터 이관
검증2일정합성 검증
전환1일시스템 전환
안정화2주병행 운영, 모니터링

날짜작성자변경 내용
2026-02-26-초안 작성 (템플릿)
2026-03-03김명직이관 대상 8건 상세화, 테이블 매핑 17건, 필드 매핑 7건 추가
2026-03-03김명직ETL 예시 실제 PT_Customer 필드명으로 수정, 검증 SQL 보강