---
type: knowledge
domain: data
status: active
last-reviewed: 2026-07-27
---

# 데이터 이관 실전

> 한 줄 정의
> 레거시→신규 데이터 이관은 코딩이 아니라 **리허설로 증명된 절차의 실행**이다 — 외주의 단골 업무이자 단골 분쟁 지점. 스키마 변경의 배포 순서는 [[배포 전략 실전]] expand-contract, 애플리케이션 마이그레이션 규율은 [[DB 접근과 트랜잭션 실전]] — 여기는 **데이터 자체의 이사**를 다룬다.

## 프로파일링 먼저 — 더러운 데이터는 이관 중에 발견하면 늦다

이관 견적·설계 전에 원본 데이터의 실태를 조사한다. 레거시 데이터는 반드시 문서와 다르다.

| 조사 항목 | 단골 발견 |
|----------|----------|
| 건수·증가 추이 | 문서상 "약 100만 건"이 실제 800만 건 |
| 필수라던 컬럼의 NULL·빈 문자열 비율 | "필수 입력"이 화면 강제 이전 데이터엔 미적용 |
| 코드 값의 실제 분포 | 코드표에 없는 값·폐기된 코드·오타 코드가 현역 |
| 중복 (자연 키 기준) | 레거시엔 유니크 제약이 없어서 중복이 정상 데이터 행세 |
| 고아 데이터 (FK 없는 참조) | 부모가 지워진 자식 행 — 신규 스키마의 FK 제약에서 전량 실패 |
| 형식 혼재 | 날짜가 문자열 컬럼에 3가지 포맷, 금액에 콤마 포함 |

- 프로파일링 결과는 **정제 규칙 합의의 근거 문서**다: 버릴 것·기본값으로 메꿀 것·발주사가 수기 정제할 것을 발주사와 합의한다 — 수행사가 임의로 버린 데이터는 검수 이후 "데이터 유실"로 돌아온다.
- 외주 지점: 프로파일링에서 드러난 레거시 품질 문제의 정제 비용이 범위에 없다면 CR 회부 대상이다 — "이관하면서 알아서 정리"를 묵시로 떠안지 않는다.

## 매핑 정의서 — 이관의 검수 문서

원본 테이블·컬럼 → 대상 테이블·컬럼의 대응을 **전 컬럼에 대해** 문서화한다. 이 문서가 이관 검수의 기준이고, **발주사 합의(서명) 없이는 착수하지 않는다** — 검수 기준은 착수 전 합의만 유효하다.

- 필수 기재: 변환 규칙(코드 매핑표·타입 변환·단위 환산), 기본값 정책(NULL을 무엇으로), **버려지는 데이터 목록과 사유**, 대상 없는 원본 컬럼의 처분.
- 코드 값 매핑(레거시 코드 → 신규 코드)은 별표로 분리해 전수 나열한다 — "기타는 99로" 같은 뭉개기 규칙이 나중에 집계 불일치의 원인이 된다.
- 매핑 정의서와 이관 스크립트가 어긋나면 문서가 아니라 결함이다 — 스크립트 변경 시 정의서를 같이 갱신하고 발주사에 재합의를 받는다.

## 리허설 N회 — 운영 규모 사본으로, 시간을 잰다

- 샘플 데이터 리허설은 리허설이 아니다 — 더러운 데이터도, 소요 시간도 규모에서만 나온다. **운영 규모 사본**으로 최소 2회: 1회차는 오류 수확, 최종회는 컷오버 절차 그대로의 총연습(클린 런)이어야 한다.
- 매회 기록: 단계별 소요 시간(추출·변환·적재·검증), 오류 건수와 유형, 정제 규칙 수정 사항. **최종 리허설의 소요 시간이 컷오버 정지 시간 계획의 근거**다 — 잰 적 없는 시간 약속은 약속이 아니다.
- 리허설 결과 대사가 어긋나는데 "본번 때는 맞겠지"로 넘어가지 않는다 — 리허설에서 안 맞으면 본번에서도 안 맞는다.
- 외주 지점: 운영 사본은 발주사 데이터다 — 반출 금지, 발주사 환경(또는 합의된 격리 환경) 안에서만 리허설하고, PII 취급은 [[개인정보와 컴플라이언스]]를 따른다.

## 컷오버 계획 — 정지 시간과 되돌림 기준

컷오버 계획서는 분 단위 타임라인이다: 레거시 쓰기 중단 → 최종 증분 이관 → 검증 → 신규 오픈. 각 단계에 담당자·확인 방법·완료 판정을 적는다.

- **Go/No-Go 기준을 사전에 숫자로**: 어떤 검증이 얼마나 어긋나면 되돌리는가, 판단 시각은 언제이고 누가 결정하는가(발주사 결정권자 명시). 컷오버 당일 새벽에 기준을 토론하지 않는다.
- **되돌림(롤백) 절차도 리허설 대상**이다 — 레거시 재개 절차가 문서에만 있으면 없는 것이다. 신규 오픈 후 유입된 데이터의 처분(레거시로 역이관하나, 버리나)까지 정해야 진짜 롤백 계획이다.
- 정지 시간을 줄여야 하면: 사전 대량 이관 + 컷오버 시엔 증분만. 이 구조는 증분 추출 기준(변경 시각·로그)이 신뢰 가능해야 성립한다 — 증분·멱등의 일반 규율은 [[데이터 파이프라인·배치 실전]].
- 신규 스키마로의 전환을 코드 배포와 한 몸으로 묶지 않는다 — 단계 분리 원칙은 [[배포 전략 실전]] expand-contract와 같다.

## 이관 검증 — 대사는 세 겹

| 겹 | 방법 | 잡는 것 |
|----|------|--------|
| 건수 대사 | 테이블별·구간별(월별 등) 원본 vs 대상 건수 | 누락·중복. 전체 합만 맞추면 "구간 A 누락 + 구간 B 중복"이 상쇄돼 숨는다 |
| 합계 대사 | 금액·수량 등 가산 가능 컬럼의 합계·구간별 소계 | 변환 오류(단위·부호·절사). 업무적으로 의미 있는 숫자로 대사해야 발주사가 승인할 수 있다 |
| 샘플 전수 비교 | 추출 규칙을 합의한 샘플(무작위 + 경계 케이스)의 **전 컬럼** 원본 대조 | 건수·합계로 안 잡히는 필드 단위 오류 (코드 오매핑·문자 깨짐·시간대 밀림) |

- 검증은 스크립트로 자동화해 **리허설마다 같은 검증을 반복**한다 — 컷오버 당일 처음 돌리는 검증은 검증이 아니다.
- 검증 결과 리포트는 발주사 승인 문서다 — "맞습니다"가 아니라 숫자 표로 제출한다.

## 병행 운영과 원본 보존

- **병행 운영 기간**(신규가 정본, 레거시는 조회용 대기)을 계약·계획에 명시한다: 기간, 레거시 정지 시점, 그 기간의 데이터 정정 처리 방침(신규에만 반영이 원칙 — 양쪽 수기 반영은 이원화 사고). 검증을 통과했어도 업무 사이클(월 정산 등)을 한 바퀴 돌아야 드러나는 오류가 있다.
- **원본 보존은 의무다**: 이관 원본 스냅샷과 이관 산출 로그(무엇을 언제 어떤 규칙으로 옮겼나)를 합의된 기간 보존한다. "이관 때 값이 바뀌었다"는 분쟁에서 유일한 증거다. 보존 주체·위치·기간을 발주사와 합의하되, **원본이든 사본이든 발주사 환경 밖 반출은 계약 위반**이다.
- 레거시 시스템 폐기는 발주사 결정이다 — 수행사가 "이관 끝났으니" 지우지 않는다.

## 안티패턴

- **프로파일링 없는 견적** — 이관 공수는 데이터 품질이 정한다. 실태 조사 없는 일정 약속이 지연의 1순위 원인이다.
- **한 방 이관** — 리허설 없이 컷오버 당일 첫 실행. 시간 초과·오류 폭주·되돌림 불가의 3콤보.
- **건수만 대사** — 800만 건이 800만 건으로 옮겨졌다는 것은 내용이 맞다는 뜻이 아니다.
- **이관 스크립트를 일회용 취급** — 버전 관리 밖의 스크립트로 운영 데이터를 옮기면 "무슨 규칙으로 옮겼는지"를 재현할 수 없다. 이관 코드도 리뷰·버전 관리·납품 대상이다.
- **검증 실패의 암묵 승인** — "99.7% 맞으니 진행하시죠"는 발주사가 문서로 승인할 때만 유효하다. 수행사 단독 판단으로 어긋난 채 오픈하면 그 0.3%는 전액 수행사 책임이 된다.

## 관련 문서

- [[00_데이터 허브]] — 07_데이터 진입점
- [[데이터 파이프라인·배치 실전]] — 멱등 적재·검증 게이트·증분 처리 (반복 실행의 규율)
- [[배포 전략 실전]] — expand-contract·롤백 우선 (스키마 변경의 배포 순서)
- [[DB 접근과 트랜잭션 실전]] — 대량 처리 청크·마이그레이션 규율 (코드 측 짝)
- [[데이터 원리]] — 모델링·수명주기 원칙
- [[개인정보와 컴플라이언스]] — 운영 사본·PII 취급·보존
- [[장애 대응 실전]] — 컷오버가 사고가 됐을 때의 대응 순서
