DiffMate

블로그로 돌아가기

데이터 마이그레이션 전 체크리스트 10가지

2025년 3월 10일

데이터 마이그레이션은 시스템 교체, 클라우드 전환, 데이터베이스 업그레이드 등 다양한 이유로 수행됩니다. 하지만 한 번의 실수로 수천 건의 데이터가 손실되거나 변형될 수 있어 철저한 준비가 필수입니다.

실제로 2012년 Knight Capital Group은 소프트웨어 배포 과정에서 마이그레이션 실수로 45분 만에 4억 6천만 달러의 손실을 입었고, 결국 회사가 인수되는 결과로 이어졌습니다. 2017년 British Airways의 IT 시스템 장애도 데이터센터 마이그레이션 과정의 전원 관리 실수에서 비롯되어 7만 5천 명의 승객에게 영향을 미치고 약 1억 파운드의 비용이 발생했습니다. 이런 사례들은 데이터 마이그레이션이 단순한 기술 작업이 아니라 비즈니스의 존폐를 좌우할 수 있는 중대한 프로젝트임을 보여줍니다.

이 글에서는 데이터 마이그레이션을 시작하기 전에 반드시 확인해야 할 10가지 체크리스트를 정리했습니다. 실무에서 바로 활용할 수 있는 구체적인 가이드입니다.

1. 원본 데이터 백업 확인

마이그레이션의 첫 번째 단계는 원본 데이터의 완전한 백업입니다. 백업은 최소 2곳 이상에 저장하고, 복원 테스트까지 완료해야 합니다. "백업이 있으니 괜찮아"라는 생각은 위험합니다. 실제로 백업 파일이 손상된 채 발견되는 경우도 드물지 않습니다.

### 3-2-1 백업 원칙

업계에서 검증된 3-2-1 백업 원칙을 따르세요. 데이터의 사본을 최소 3개 유지하고, 2가지 다른 유형의 저장 매체를 사용하며, 1개는 반드시 원격지(오프사이트)에 보관합니다. 예를 들어, 로컬 디스크에 하나, NAS에 하나, 클라우드 스토리지(AWS S3, Azure Blob 등)에 하나를 보관하는 방식입니다.

### 전체 백업 vs 증분 백업

마이그레이션 직전에는 반드시 전체 백업(Full Backup)을 수행해야 합니다. 일상적인 운영에서는 증분 백업(Incremental Backup)으로 충분하지만, 마이그레이션처럼 대규모 변경이 예정된 경우에는 특정 시점의 완전한 스냅샷이 필요합니다. 백업 후에는 체크섬(MD5, SHA-256)을 계산하여 기록해두면 백업 무결성을 나중에 검증할 수 있습니다.

### 복원 테스트 필수

백업을 만들었다고 끝이 아닙니다. 반드시 별도 환경에서 복원 테스트를 수행하세요. 복원에 소요되는 시간도 측정해두면 롤백 계획 수립에 도움이 됩니다. 다음 SQL로 데이터베이스 백업의 기본 무결성을 확인할 수 있습니다:

```sql -- 백업 전 레코드 수 기록 SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'your_database';

-- 주요 테이블의 체크섬 CHECKSUM TABLE orders, customers, products; ```

2. 데이터 매핑 문서 작성

원본 시스템과 대상 시스템의 테이블 구조, 필드명, 데이터 타입을 1:1로 매핑하는 문서를 작성하세요. 필드명이 다르거나 데이터 타입이 변환되는 경우를 모두 기록해야 합니다. 이 문서는 마이그레이션 후 검증의 기준이 됩니다.

### 매핑에서 놓치기 쉬운 항목들

데이터 타입 변환 시 주의할 점이 많습니다. 예를 들어, MySQL의 DATETIME을 PostgreSQL의 TIMESTAMP WITH TIME ZONE으로 변환할 때 시간대 정보가 누락될 수 있습니다. VARCHAR의 길이 제한이 다른 경우 데이터가 잘리는 문제도 흔합니다. NULL 허용 여부, 기본값 설정, AUTO_INCREMENT와 SERIAL의 차이, 문자열 인코딩 차이까지 모두 문서화해야 합니다.

### ETL 도구 활용

수동 매핑이 복잡한 경우 ETL(Extract, Transform, Load) 도구를 활용하세요. Apache NiFi는 시각적 데이터 플로우 설계가 가능하고, Talend Open Studio는 복잡한 변환 로직에 강합니다. AWS Glue는 클라우드 환경에서 서버리스 ETL을 제공하며, 간단한 매핑이라면 Python의 pandas와 SQLAlchemy 조합으로 커스텀 스크립트를 작성하는 것도 효과적입니다.

```python # 간단한 매핑 스크립트 예시 import pandas as pd from sqlalchemy import create_engine

source_engine = create_engine('mysql://user:pass@source_host/db') target_engine = create_engine('postgresql://user:pass@target_host/db')

df = pd.read_sql('SELECT * FROM legacy_customers', source_engine)

# 필드명 매핑 및 변환 df = df.rename(columns={ 'cust_nm': 'customer_name', 'tel_no': 'phone_number', 'reg_dt': 'created_at' })

df.to_sql('customers', target_engine, if_exists='append', index=False) ```

3. 데이터 정합성 기준 정의

어떤 상태가 "성공"인지 명확히 정의하세요. 레코드 수 일치, 필수 필드 누락 없음, 합계값 일치 등 구체적인 검증 기준을 미리 정해야 합니다. 기준 없이 "대충 맞는 것 같다"로 넘어가면 나중에 문제가 커집니다.

### 정합성 검증 SQL 예시

마이그레이션 전후로 다음과 같은 쿼리를 실행하여 데이터 정합성을 체계적으로 검증할 수 있습니다:

```sql -- 테이블별 레코드 수 비교 SELECT 'source' AS system, COUNT(*) AS cnt FROM source_db.orders UNION ALL SELECT 'target' AS system, COUNT(*) AS cnt FROM target_db.orders;

-- 숫자형 필드 합계 비교 SELECT 'source' AS system, SUM(amount) AS total, AVG(amount) AS avg_amount FROM source_db.orders UNION ALL SELECT 'target' AS system, SUM(amount) AS total, AVG(amount) AS avg_amount FROM target_db.orders;

-- NULL 값 분포 비교 SELECT 'source' AS system, SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS null_emails, SUM(CASE WHEN phone IS NULL THEN 1 ELSE 0 END) AS null_phones FROM source_db.customers UNION ALL SELECT 'target' AS system, SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS null_emails, SUM(CASE WHEN phone IS NULL THEN 1 ELSE 0 END) AS null_phones FROM target_db.customers;

-- 고유값 분포 비교 SELECT 'source' AS system, status, COUNT(*) AS cnt FROM source_db.orders GROUP BY status UNION ALL SELECT 'target' AS system, status, COUNT(*) AS cnt FROM target_db.orders GROUP BY status; ```

### 자동화된 검증 스크립트

수동으로 쿼리를 하나씩 실행하는 것은 비효율적이고 실수가 발생하기 쉽습니다. Python이나 셸 스크립트로 검증 파이프라인을 자동화하여 모든 테이블에 대해 레코드 수, 체크섬, NULL 분포, 외래 키 무결성을 자동으로 비교하는 시스템을 구축하세요. Great Expectations 같은 데이터 품질 프레임워크를 활용하면 더욱 체계적인 검증이 가능합니다.

4. 테스트 환경 구성

프로덕션 데이터로 바로 마이그레이션하지 마세요. 반드시 테스트 환경에서 먼저 실행하고, 결과를 검증한 후에 본 환경에 적용합니다. 테스트 환경은 프로덕션과 최대한 동일한 조건으로 구성해야 합니다.

### 테스트 방법론

마이그레이션 테스트는 여러 단계로 나누어 진행하는 것이 효과적입니다. 첫째, 단위 테스트(Unit Test)로 개별 테이블의 마이그레이션 로직을 검증합니다. 둘째, 통합 테스트(Integration Test)로 테이블 간 관계(외래 키, 참조 무결성)가 유지되는지 확인합니다. 셋째, 부하 테스트(Load Test)로 실제 데이터 규모에서의 성능을 측정합니다. 마지막으로 사용자 수용 테스트(UAT)로 최종 사용자가 마이그레이션된 데이터로 정상 업무를 수행할 수 있는지 확인합니다.

### 성능 테스트 포인트

마이그레이션 시 성능은 매우 중요한 요소입니다. 전체 데이터 이관에 걸리는 시간, 네트워크 대역폭 사용량, 소스/타깃 시스템의 CPU 및 메모리 사용률을 반드시 측정하세요. 특히 대용량 마이그레이션의 경우 JMeter나 Locust 같은 도구로 마이그레이션 중 기존 서비스에 미치는 영향을 사전에 파악하는 것이 중요합니다.

5. 인코딩 및 로케일 확인

한글, 중국어, 일본어 등 다국어 데이터가 포함된 경우 인코딩 문제가 빈번하게 발생합니다. UTF-8이 표준이지만, 레거시 시스템은 EUC-KR이나 Shift_JIS를 사용하는 경우가 많습니다. 마이그레이션 전에 원본 인코딩을 정확히 파악하세요.

실제로 인코딩 문제를 방치하면 한글이 "?????"나 "ã??ã??"처럼 깨져 보이는 mojibake 현상이 발생합니다. 이런 문제는 발견 즉시 수정하지 않으면 원본 데이터를 복구하기 매우 어렵습니다. DiffMate를 사용하면 마이그레이션 전후의 텍스트 파일을 비교하여 인코딩 변환 과정에서 발생한 문자 깨짐을 빠르게 감지할 수 있습니다.

날짜 형식과 숫자 형식도 로케일에 따라 달라집니다. 한국에서는 "2025-03-10"이 표준이지만, 미국은 "03/10/2025", 유럽 일부 국가는 "10.03.2025"를 사용합니다. 소수점 표기도 한국과 미국은 마침표(3.14)를 사용하지만, 독일이나 프랑스는 쉼표(3,14)를 사용합니다. 이런 차이를 무시하면 금액이나 날짜 데이터가 잘못 해석될 수 있습니다.

6. 대용량 데이터 처리 전략

수백만 건의 데이터를 한 번에 이동하면 시스템 부하와 타임아웃 문제가 발생할 수 있습니다. 배치 단위로 나누어 처리하고, 각 배치의 성공/실패를 로깅하는 전략을 세워야 합니다.

### 배치 처리 설계

데이터를 10,000~50,000건 단위로 나누어 처리하되, 테이블 간 참조 관계를 고려한 순서로 진행하세요. 예를 들어, 고객(customers) 테이블을 먼저 이관한 후 주문(orders) 테이블을 이관해야 외래 키 제약 조건 위반을 방지할 수 있습니다. 각 배치마다 커밋 포인트를 설정하여 실패 시 해당 배치만 재실행할 수 있도록 합니다.

### 클라우드 환경 마이그레이션 고려사항

클라우드로의 마이그레이션은 추가적인 도전 과제가 있습니다. AWS의 경우 Database Migration Service(DMS)를 활용하면 지속적인 복제(CDC)가 가능합니다. Azure는 Azure Database Migration Service를, GCP는 Database Migration Service를 제공합니다. 대용량 데이터의 경우 네트워크 전송 시간을 계산해보세요. 1TB 데이터를 100Mbps 회선으로 전송하면 약 22시간이 걸립니다. AWS Snowball이나 Azure Data Box 같은 물리적 전송 서비스도 고려할 수 있습니다.

7. 롤백 계획 수립

마이그레이션이 실패하거나 문제가 발견되었을 때 원래 상태로 되돌리는 계획을 반드시 준비하세요. 롤백에 걸리는 시간, 필요한 리소스, 담당자를 사전에 정해두어야 합니다.

### 병렬 운영(Parallel Run) 전략

가장 안전한 방법 중 하나는 병렬 운영입니다. 기존 시스템과 새 시스템을 일정 기간 동시에 운영하면서 결과를 비교합니다. 새 시스템의 안정성이 확인되면 기존 시스템을 단계적으로 중단합니다. 병렬 운영 기간 동안에는 양쪽 시스템의 데이터를 주기적으로 내보내(CSV/Excel) DiffMate로 비교하면 불일치를 즉시 발견할 수 있습니다.

### 롤백 시나리오별 대응

롤백 상황을 여러 시나리오로 나누어 대응 방안을 준비하세요. 시나리오 A는 마이그레이션 중 오류 발생으로 아직 서비스 전환 전인 상태이므로, 단순히 마이그레이션을 중단하고 원본 시스템을 유지하면 됩니다. 시나리오 B는 마이그레이션 완료 후 데이터 불일치가 발견된 경우로, 백업에서 복원 후 불일치 원인을 분석해야 합니다. 시나리오 C는 서비스 전환 후 성능 문제가 발생한 경우로, DNS나 로드 밸런서 전환을 통해 기존 시스템으로 트래픽을 되돌려야 합니다. 각 시나리오별 예상 소요 시간과 담당자를 문서화해두세요.

8. 이해관계자 커뮤니케이션

마이그레이션 일정, 예상 다운타임, 영향 범위를 관련 팀에 사전 공지하세요. 갑작스러운 서비스 중단은 고객 불만과 비즈니스 손실로 이어집니다.

### 커뮤니케이션 단계별 템플릿

효과적인 커뮤니케이션을 위해 단계별 알림 체계를 구축하세요. 마이그레이션 2주 전에는 전체 일정, 영향 범위, 준비 사항을 공지합니다. 1주 전에는 구체적인 시간표와 비상 연락처를 안내합니다. 당일에는 시작/진행/완료 상태를 실시간으로 업데이트합니다. 완료 후에는 결과 요약과 잔여 이슈를 공유합니다.

### 규정 준수(Compliance) 고려사항

개인정보가 포함된 데이터를 마이그레이션할 때는 관련 규정을 반드시 확인하세요. GDPR(유럽 일반 데이터 보호 규정)에서는 개인 데이터의 이전 시 적절한 보호 조치를 요구하며, 특히 EU 외부로의 데이터 이전에는 추가적인 법적 근거가 필요합니다. HIPAA(미국 의료정보 보호법)의 경우 의료 데이터의 마이그레이션 시 암호화, 접근 제어, 감사 로그를 반드시 유지해야 합니다. 국내에서는 개인정보보호법에 따라 개인정보 처리 위탁 시 정보주체에게 통지해야 할 수 있으며, 해외 이전 시에는 더 엄격한 요건이 적용됩니다. 마이그레이션 계획 단계에서 법무/컴플라이언스 팀과 반드시 협의하세요.

9. 마이그레이션 후 비교 검증

마이그레이션 완료 후 원본과 결과 데이터를 반드시 비교 검증해야 합니다. CSV나 엑셀로 추출하여 DiffMate 같은 비교 도구로 행 단위, 셀 단위 차이를 확인하면 누락이나 변형을 빠르게 발견할 수 있습니다.

### 데이터 재조정(Reconciliation) 기법

마이그레이션 후 데이터 재조정은 크게 세 가지 수준에서 수행합니다. 첫째, 건수 재조정으로 테이블별 총 레코드 수가 일치하는지 확인합니다. 둘째, 값 재조정으로 숫자형 필드의 합계, 평균, 최대/최소값을 비교합니다. 셋째, 행 단위 재조정으로 주요 테이블의 모든 행을 1:1로 비교합니다.

행 단위 재조정이 가장 정확하지만 시간이 많이 소요됩니다. 이때 DiffMate가 큰 도움이 됩니다. 원본과 대상 시스템에서 각각 CSV로 데이터를 추출하고, DiffMate에 업로드하면 차이점을 시각적으로 확인할 수 있습니다. 변경된 셀은 하이라이트로 표시되고, 추가/삭제된 행도 명확하게 구분됩니다.

### 자동 검증 스크립트 예시

```sql -- 마이그레이션 후 누락된 레코드 찾기 SELECT s.id, s.customer_name FROM source_db.customers s LEFT JOIN target_db.customers t ON s.id = t.id WHERE t.id IS NULL;

-- 값이 변경된 레코드 찾기 SELECT s.id, s.amount AS source_amount, t.amount AS target_amount FROM source_db.orders s JOIN target_db.orders t ON s.id = t.id WHERE s.amount <> t.amount; ```

10. 사후 모니터링 기간 설정

마이그레이션 직후에는 정상으로 보여도 시간이 지나면서 문제가 드러나는 경우가 있습니다. 최소 1~2주간 집중 모니터링 기간을 설정하고, 이상 징후 발생 시 즉시 대응할 수 있는 체계를 갖추세요.

### 모니터링 핵심 지표

사후 모니터링 기간 동안 다음 지표들을 집중적으로 관찰하세요. 첫째, 애플리케이션 에러율의 변화입니다. 마이그레이션 전 대비 에러율이 상승했다면 데이터 구조나 값에 문제가 있을 수 있습니다. 둘째, 쿼리 응답 시간입니다. 인덱스 누락이나 통계 정보 부재로 인해 성능이 저하될 수 있습니다. 셋째, 사용자 보고입니다. 고객 지원팀과 긴밀히 협조하여 "데이터가 이상하다"는 보고가 있는지 즉시 파악해야 합니다. 넷째, 배치 작업 성공률입니다. 야간 배치 작업이 마이그레이션 후 실패한다면 데이터 형식이나 접근 권한에 문제가 있을 수 있습니다.

### 모니터링 자동화

Grafana, Datadog, CloudWatch 등 모니터링 도구에 마이그레이션 관련 대시보드를 사전에 구성해두면 이상 징후를 빠르게 포착할 수 있습니다. 임계값 기반 알림을 설정하여 에러율 급증, 응답 시간 지연 등이 발생하면 담당자에게 즉시 알림이 가도록 하세요. 매일 자동으로 원본과 타깃의 주요 수치를 비교하는 리포트를 생성하는 것도 좋은 방법입니다.

결론

데이터 마이그레이션의 성공은 사전 준비에 달려 있습니다. 위 체크리스트를 하나씩 점검하면 예상치 못한 문제를 최소화할 수 있습니다. Knight Capital이나 British Airways의 사례에서 보듯, 마이그레이션 실수의 대가는 상상 이상으로 클 수 있습니다.

특히 마이그레이션 후 데이터 비교 검증은 반드시 수행해야 할 핵심 단계입니다. 모든 테이블의 모든 행을 수동으로 비교하는 것은 현실적으로 불가능하지만, DiffMate 같은 도구를 활용하면 CSV나 Excel로 추출한 데이터의 차이점을 시각적으로 빠르게 확인할 수 있습니다. 체계적인 준비, 철저한 검증, 그리고 적절한 도구의 활용이 성공적인 마이그레이션의 세 가지 핵심 요소입니다.

DiffMate로 데이터 비교하기