금액 컬럼의 precision을 줄이는 migration에서 기존 값과 계산 결과가 범위를 넘는 행을 어떻게 처리하나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
precision을 줄이는 migration은 DDL 성공 여부가 아니라 데이터와 미래 계산이 새 계약에 들어오는지로 판단합니다. 먼저 최대 절댓값, 정수부 자릿수, 실제 scale, 음수 환불과 NULL 분포를 조회하고 새 타입 변환에서 실패할 행을 shadow 계산으로 분리합니다. decimal(12,2)에서 decimal(10,2)로 줄이면 정수부 폭이 줄어 1,000,000,000.00 같은 값이 범위를 벗어날 수 있습니다.
넘는 행은 조용히 절삭하지 않습니다. 단위 변경이나 합법적 반올림으로 의미를 보존할 수 있는지 검토하고, 더 넓은 컬럼·별도 overflow 원장·명시적 migration 중단을 선택합니다. 수량×단가×세율 같은 미래 중간 결과도 기존 값보다 큰지 계산해야 합니다.
구버전 writer가 남아 있다면 새 컬럼을 바로 권위로 만들지 않습니다. 구·신 writer 호환, version 조건부 백필, 불일치 대조, 읽기 전환, 옛 경로 제거를 나눕니다. 백필이 읽은 version 이후 정상 변경을 덮지 않게 하고, 변환 전후 원장 합계·반올림 차이·overflow 수·writer별 불일치를 기록하겠습니다.
새 타입의 최대 정수부는 decimal(10,2)에서 8자리이므로 1,000,000,000.00은 shadow cast 단계에서 실패 행이 됩니다. 999,999,999.99처럼 경계에 가까운 정상 행, 19.995처럼 scale만 조정되는 행, 음수 환불과 NULL을 각각 분류해 조용한 절삭과 정책상 반올림을 구별합니다. 기존 최댓값이 들어가도 미래의 수량×단가×세율 peak가 새 범위를 넘을 수 있으므로 write path에 같은 검사를 둡니다.
구 writer가 남아 있을 때는 새 컬럼을 바로 기준으로 바꾸지 않습니다. 이중 쓰기 뒤에 행별 version을 조건으로 백필하고, 백필이 읽은 version보다 최신인 행은 건너뛰거나 재시도합니다. overflow가 한 건이라도 있으면 owner가 보정·컬럼 확장·별도 원장·중단 중 선택해야 하며, migration 성공을 행 수 0으로만 판단하지 않고 전후 합계와 반올림 차이를 audit에 남깁니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 최댓값·실제 scale·계산 peak를 별도로 검사합니다.
- overflow 행을 보정·확장·거절로 분류하고 조용한 절삭을 피합니다.
- 구·신 writer와 조건부 백필의 경쟁을 다룹니다.
- DDL 성공과 의미 보존을 구분합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 기존 데이터가 들어간다는 이유로 미래 계산도 범위 안이라고 합니다.
- 반올림으로 범위를 넘는 값을 임의로 자릅니다.
- 백필 checkpoint만 전진시키고 충돌 행을 재처리하지 않습니다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 새 타입으로 변환할 수 없는 행이 1건일 때 online cutover를 계속할 조건은 무엇인가요?
- 금액 계산 version을 원장과 projection에 어떻게 연결하겠습니까?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.