업무 파일을 다루는 도구를 만들다 겪은 일입니다. 파일을 열고 한 글자도 고치지 않고 저장했습니다. 그런데 내용이 달라져 있었습니다.
앞자리 0이 사라졌습니다
전화번호, 우편번호, 사업자번호, 계좌번호. 0으로 시작하는 값이 전부였습니다.
010-1234-5678 → 10-1234-5678
0503 → 503
원인은 이렇습니다. 표 계산 파일에서 셀은 값과 표시 형식이 따로 있습니다. 저장할 때 이 둘을 같이 써야 하는데, 제가 만든 코드는 값만 다시 쓰고 형식을 버렸습니다.
형식이 없으면 010 은 그냥 숫자 10입니다. 앞의 0은 표시상의 약속이었으니까요.
고친 방법
파일을 통째로 다시 만들지 않고, 원본을 그대로 두고 바꾼 부분만 덮어쓰게 했습니다. 손대지 않은 셀은 원본 그대로 남습니다.
"다시 만든다"와 "고쳐 쓴다"는 다릅니다. 다시 만들면 내가 모르는 것들이 전부 사라집니다. 그리고 파일 형식에는 내가 모르는 게 아주 많습니다.
더 무서운 건 이쪽이었습니다
이걸 고치면서 검증을 왜 통과했는지를 봤습니다.
제가 만든 검증은 이랬습니다.
- 파일이 열리는가
- 내부 구조가 규격에 맞는가
- 필요한 항목이 다 있는가
깨진 파일도 이 셋을 전부 통과했습니다. 구조는 멀쩡했으니까요. 내용만 틀렸습니다.
규격에 맞는 것과 내용이 살아 있는 것은 다른 이야기입니다.
그래서 검증을 바꿨습니다
파일을 원래 그 프로그램으로 실제로 열고, 값을 하나하나 원본과 비교하게 했습니다.
원본 열기 → 값 목록 뽑기
저장본 열기 → 값 목록 뽑기
두 목록이 완전히 같은지 비교
느립니다. 그런데 이것만이 진실을 말합니다. 구조만 보는 검증은 그때까지 손상을 한 건도 못 잡았습니다.
같은 도구에서 나온 다른 두 개
숫자처럼 생긴 이름 때문에 저장이 통째로 실패
값을 바꿔 넣는 코드가 이랬습니다.
text = text.replace(name, value);
이름이 문자열일 때는 잘 돌았습니다. 그런데 이름이 숫자로 들어오는 경우가 있었고, 숫자에는 그 함수가 없습니다. 저장 전체가 죽었습니다.
한 항목 때문에 파일 하나가 통째로 저장 안 되는 결과였습니다. 항상 문자열로 바꿔서 넘기게 고쳤습니다.
붙여넣기는 됐는데 저장하면 파일이 깨짐
내용을 붙여 넣는 기능이 있었습니다. 화면에는 잘 들어갔습니다. 저장하고 다시 열면 파일이 손상됐다고 나왔습니다.
원인은 지워진 조각을 가리키는 연결이 남아 있던 것이었습니다. 본체는 지웠는데 참조가 남았고, 프로그램은 그 참조를 따라가다 실패했습니다.
화면에서는 안 보입니다. 저장하고 다시 열어야만 드러납니다.
세 개의 공통점
전부 저장한 뒤 다시 열어야만 드러납니다.
작업 중에는 멀쩡해 보입니다. 그래서 만드는 사람은 못 봅니다. 쓰는 사람이 며칠 뒤에 봅니다. 그때는 원본이 이미 덮어써진 뒤입니다.
가져갈 것
- 파일을 다시 만들지 말고 고쳐 쓰세요. 다시 만들면 모르는 것들이 조용히 사라집니다.
- 구조 검증은 손상을 못 잡습니다. 실제로 열어서 값을 비교하세요.
- 왕복 검사(저장하고 다시 열어 원본과 비교)가 유일하게 믿을 만한 검사입니다.
- 숫자처럼 생긴 값이 문자열 자리에 들어올 수 있습니다. 한 건이 저장 전체를 무너뜨립니다.
- 무언가를 지울 때는 그걸 가리키는 것들도 같이 지우세요.
제일 뼈아팠던 건 제가 만든 검증이 저를 안심시켰다는 점입니다. 검증이 없었으면 손으로 열어 봤을 텐데, 있으니까 안 봤습니다.
믿을 수 없는 검증은 없느니만 못합니다.
만든 것들
'Coding, Testing, Challenge' 카테고리의 다른 글
| 한 줄 고치려다 53개 파일의 한글을 전부 날렸습니다 (0) | 2026.09.24 |
|---|---|
| 100MB를 15밀리초에 보냈다고 믿었습니다 (0) | 2026.09.23 |
| API 9개가 404였는데, 서버 로그에는 아무것도 없었습니다 (1) | 2026.09.19 |
| 화면이 멈춘 게 아니라, 세 가지가 각각 달랐습니다 (0) | 2026.09.17 |
| 4초짜리 쿼리가 1,200초가 됐습니다 (0) | 2026.09.15 |