자료를 옮기는 작업에서 가장 위험한 문장은 “다 들어갔습니다”일 수 있다. 파일이 생겼다는 뜻인지, 행이 저장됐다는 뜻인지, 원래 장부의 잔액과 맞는다는 뜻인지 알 수 없기 때문이다. 이 프로젝트의 대화에는 전체 자료를 가져오고 남은 업체별 대장까지 확인하자는 요청이 이어진다. 나는 그 요구를 하나의 성공 표시로 묶기보다 어떤 범위의 완료를 확인할 수 있는지 나누어 읽었다.

내려받은 파일은 거래 건수가 아니다

같은 거래가 전표 목록, 품목별 내역, 거래처 대장에 반복해서 나타날 수 있다. 세 파일에 각각 한 줄이 있다고 세 건의 거래로 넣으면 이관 직후부터 합계가 어긋난다. 보존할 원본의 단위와 새 업무 기록의 단위는 다르다. 원본은 파일별로 남기되, 업무 자료로 변환할 때는 각 행이 어떤 문서와 어떤 상세를 나타내는지 구분해야 한다.

내가 중요하게 본 연결은 출처 파일, 출처 행, 원래 식별 값, 변환한 기록 사이의 관계다. 원본을 정리하면서 같은 이름의 새 파일로 덮어쓰면 왜 현재 값이 만들어졌는지 추적하기 어려워진다. 파일 이름만 믿지 않고 내용 해시와 크기를 함께 보관하면 이름이 같은 다른 파일과 내용이 같은 사본을 구별하는 데 도움이 된다. 다만 해시 일치가 업무 의미의 일치까지 보장하지는 않는다.

보존의 성공, 해석의 성공, 업무 대조의 성공을 같은 열에 쓰지 않는 것만으로도 보고서의 의미는 훨씬 분명해진다.

파일 보존과 적재를 따로 검사했다

보관된 전체 점검 기록은 받은 파일의 해시와 예상 행 수, 데이터베이스 관계를 확인한 범위를 설명한다. 이는 유용한 근거다. 그러나 받은 파일을 모두 보존했다고 외부 시스템에 있는 자료를 전부 받았다고 결론 내릴 수는 없다. 조회 기간이 다르거나 출력 조건이 남아 있거나, 다운로드가 끝나지 않은 대장이 있을 수 있기 때문이다.

따라서 이관 장부에는 수집 요청, 실제 수신, 해시 확인, 해석 성공, 적재 결과, 업무 대조를 별도로 적는 편이 좋다. 실패한 다운로드를 빈 자료로 취급하거나, 해석하지 못한 행을 조용히 버리지 않는다. 받지 못한 범위와 받은 뒤 해석하지 못한 범위가 다르게 보여야 다음 사람이 어디에서 이어야 할지도 알 수 있다. 완료 표시는 이 장부의 근거를 따라가야 한다.

마지막 비교는 독립된 질문으로 해야 한다

옮기는 코드가 만든 합계를 같은 코드로 다시 읽는 것만으로는 공통된 오류를 찾기 어렵다. 당시 보고서는 독립적인 집계와 원본 행 대조를 남겼으며, 전체 수집이 아직 확인되지 않았다는 한계도 함께 적었다. 나는 이런 문장을 실패의 흔적으로 지우지 않는다. 무엇을 믿고 무엇을 추가 확인해야 하는지 알려 주는 운영 정보이기 때문이다.

독자가 적용한다면 한 거래처의 시작 잔액, 기간 중 증가와 감소, 종료 잔액을 따로 비교해 볼 수 있다. 여기서 과거 잔액을 단순히 거래 합계로 재구성할 수 있다고 가정하면 안 된다. 기초 값이나 조정, 적용 날짜가 다를 수 있다. 차이가 나면 원본을 고쳐 맞추기보다 어느 범위와 정의에서 차이가 생기는지 기록하고 판단을 보류하는 경로를 남긴다.

재개할 수 있어야 큰 이관을 끝낼 수 있다

많은 파일을 처리하다가 중간에 멈추는 일은 예외가 아니다. 이미 받은 파일, 대기 중인 요청, 적재한 기록의 식별자를 남겨야 재시작할 때 중복을 피할 수 있다. 같은 이름을 다시 받았다고 무조건 새 거래를 추가하거나, 마지막 출력 숫자만 기억해 그 이전을 확인 완료로 처리해서는 안 된다. 작업 상태는 확인 가능한 산출물과 함께 남겨야 한다.

이번 제작기에서 내가 확인한 것은 제공된 사본의 구조와 선택한 이관 코드, 당시 대조 보고서다. 원래 회사 자료와 외부 장부는 포함되지 않았고 현재 운영 자료도 조회하지 않았다. 따라서 당시 보고서의 수집 한계를 이번 글에서 해소했다고 말할 수 없다. 이관을 맡길 때는 완료라는 단어 대신 받은 범위, 저장한 범위, 맞춰 본 범위와 남은 차이를 각각 요구하는 것이 더 정확하다.