호라이즌앱스 로고
← 기술 노트

본사 마감 엑셀 양식이 매달 바뀔 때, 업로드가 반만 들어가는 문제

임균영조회 —

6월 마감 파일은 확장자부터 달랐습니다. 지난달까지 xlsx로 오던 본사 마감본이 xlsb로 와 있었습니다.

안쪽은 더 바뀌어 있었습니다. 전달에 한 달만 붙어 있던 차액 열이 빠졌습니다.

시책 시트에서는 환수율과 지급액 열이 사라졌습니다.

#N/A가 찍힌 오류 칸도 1,608개였습니다.

제가 정산 시스템을 맡고 있는 보험대리점(GA) 지사는 이 파일을 매달 시스템에 넣어야 합니다.

업로더가 열 이름을 확인하지 않는다면 없는 열은 빈칸으로 들어갑니다. 화면에는 '완료'가 뜨고 합계만 조용히 틀어질 수 있습니다.

그 상태로 대사를 돌리면 화면은 그럴듯한 거짓말을 합니다. 아래는 그 지사의 월 마감 적재를 다시 만들면서 정한 기준입니다.

고정 업로더가 무너지는 모양

본사 규격은 달마다 움직였습니다. 열이 지워지고 파일 형식이 바뀌었습니다.

시책 열 구성이 달라지더니 시책 항목 하나가 폐지된 달도 있었습니다.

고정 업로더는 이런 변화를 조용히 반만 먹거나, 통째로 거부합니다. 반만 먹는 쪽이 더 위험합니다.

오류 없이 끝나니 아무도 다시 열어 보지 않습니다. 틀린 합계는 다음 달 보고서까지 그대로 따라갑니다.

거부하는 쪽에도 대가가 있습니다. 이 지사의 기존 웹 업로더는 xlsx 두 종류만 받았습니다.

정산 파일은 화면에서 받을 것처럼 보여 놓고 서버에서 거절했습니다.

적재는 사람이 데이터베이스에 직접 복사해 넣는 수작업이 됐고 기록도 남지 않았습니다. 사람 한 명에 묶인 적재는 결국 두 달 동안 멈췄습니다.

첫 xlsb에서 멈춘 자리들

새로 만든 적재기는 넣기 전에 파일을 먼저 훑습니다. 이 단계는 읽기만 하며 시트별 행 수와 금액 합, 중복 후보를 보고합니다.

헤더가 기대와 다르거나 숫자 변환이 실패하면 그 자리에서 멈춥니다. 6월 xlsb에서는 이 멈춤이 여러 번 났습니다.

멈춘 이유처리
한 달만 붙었던 차액 열이 사라짐선택 열로 등록, 없으면 빈 값
시책 시트의 환수율·지급액 열 삭제선택 열로 흡수
#N/A 오류 칸 1,608개오류 코드를 빈 값(NULL)으로 정규화
빈 헤더가 빈 문자열 대신 None으로 읽힘헤더 정규화에서 같은 것으로 처리

멈출 때마다 원인을 보고 다음 달에도 올 수 있는 변화인지 판단했습니다. 그렇다고 본 변화만 적재기 규칙에 넣었습니다.

열은 이름으로 찾습니다. 같은 '지사수입' 열이 한 파일에서는 '법인' 앞에서, 다른 파일에서는 뒤에서 줄이 바뀌어 온 적이 있습니다.

그래서 줄바꿈과 공백을 지운 이름으로 대조합니다. 열 순서가 밀려도 이름이 맞으면 제자리를 찾습니다.

열 이름을 확인하지 않는 업로더였다면 6월 파일 하나에서 두 방식이 이렇게 갈립니다.

열 이름을 보지 않는 고정 업로더라면 지급액 열이 빠진 파일도 막대를 끝까지 채우고 빈칸째 받을 수 있습니다. 새 적재기는 같은 파일에서 멈춰 없는 열을 알리고, 규칙을 보강한 뒤 온 7월 파일은 그대로 통과해 DB 재계수까지 맞습니다. 그림 속 금액은 가상 값입니다.

다음 달은 코드 수정 없이

7월 마감본이 왔을 때 사전 점검은 한 번도 멈추지 않았습니다. 코드 수정 0줄로 3개 시트 64,768행이 들어갔고, DB에서 다시 센 값도 맞았습니다.

6월에 봉합한 규칙이 7월 파일을 그대로 소화한 셈입니다. 매달 겪은 변화가 규칙으로 쌓이니 다음 달이 조금씩 조용해집니다.

구분6월 마감본(첫 xlsb)7월 마감본
사전 점검헤더·변환 오류로 여러 번 정지무정지 통과
코드 수정선택 열·오류 정규화 추가0
적재 결과실지급·시책 적재3시트 64,768행, 재계수 일치

이 절차는 AI 에이전트가 읽는 작업 매뉴얼로 만들어 두었습니다. 처음 보는 변화에서는 멈추고 무엇이 달라졌는지 사람에게 보고합니다.

판단을 받은 변화만 규칙에 더합니다.

7월 파일은 정해 둔 폴더에 없었습니다. 다른 공유 폴더 두 곳을 뒤져 같은 시각에 저장된 같은 파일을 찾았습니다.

파일명 꼬리도 본사 표기 방식이 바뀌어 낯선 날짜 꼴로 와 있었습니다. 그래서 월은 적재할 때 따로 지정하고 그 값으로 대조합니다.

메일로 받은 지급률 파일이 '양식이 바뀐 것'처럼 보인 적도 있습니다. 열어 보니 같은 계열이 아닌 파일이었습니다.

넣은 뒤에 다시 세기

적재가 끝나면 데이터베이스가 직접 다시 셉니다. 적재기가 보낸 행 수·금액 합과 DB에서 센 값이 다르면 그 달 적재 전체를 되돌립니다.

한 트랜잭션 안에서 벌어지는 일이라 반만 들어간 달이 남지 않습니다.

그다음은 장부와 맞춰 봅니다. 시책 건별 합계를 본사 원장의 시책 수입과 대조하는 식입니다.

2025년 1월부터 2026년 6월까지 열여덟 달은 원 단위까지 같았습니다. 7월은 0.25% 어긋났습니다.

이 차이는 플래그로 남겼습니다. 그 달 본사 원장이 아직 닫히지 않은 잠정본이었고, 본사가 나중에 고치면 풀릴 수 있는 차이였습니다.

장부 대조에서 생기는 차이에는 이름을 둘로 나눠 붙였습니다. 우리 합산이 틀린 '검산차이'는 언제나 0이어야 하고, 본사 원본이 덜 닫힌 '원천차이'는 있어도 됩니다.

둘을 '불일치' 하나로 부르면 화면은 매달 우리 버그를 신고합니다. 그러다 진짜 버그가 났을 때는 아무도 보지 않게 됩니다.

빈칸도 0으로 바꾸지 않습니다. 과거 일곱 달 자료는 수입 합계 칸이 통째로 비어 있었고, 0으로 접으면 '그달 시책 수입이 0원'이라는 거짓이 됩니다.

남이 계산한 합계도 그대로 믿지 않습니다. 같은 지사의 운영비 취합 엑셀은 한 달 합계가 틀려 있었습니다.

그달 새로 생긴 열 하나가 합계 수식 범위 밖에 있었습니다.

이미 닫은 달은 건드리지 않기

마감 파일에는 이번 달만 들어 있지 않습니다. 본사는 지난달 숫자를 나중에 고쳐서 다시 보내기도 합니다.

본사가 고친 숫자는 달라진 칸만 따로 기록해 화면에 '본사가 나중에 고친 숫자'로 보여 줍니다.

장부를 갱신할 자격은 가장 최근에 받은 판에 줬습니다. 여기에 빈틈이 있었습니다.

최신본은 받은 순서로 정해지니, 옛 자료를 뒤늦게 채워 넣으면 그 옛 판이 최신본 자격을 갖습니다.

그래서 과거분은 오래된 판부터 넣습니다. 대사가 어긋나는 달은 과거분 적재 목록에서 뺍니다.

과거분 적재기는 그 달을 지우고 다시 넣는 방식입니다. 실제로 한 달은 과거 통합본과 금액이 어긋나 있었습니다.

그 달을 목록에 넣었다면 대사 실패와 함께 라이브에 있던 적재까지 지워졌을 겁니다.

확정 버튼은 사람이

적재와 검산은 기계가 맡아도 됩니다. "이 달은 이제 사실입니다"라는 서명은 담당자와 대표가 합니다.

에이전트는 확정 버튼을 대신 누르지 않습니다.

다만 서명할 근거는 기계가 먼저 내놓아야 합니다.

이 지사에서는 지출을 다 넣은 아홉 달 중 여덟 달이 확정되지 않은 채 열려 있었습니다.

처음엔 담당자가 안 누르는 줄 알았습니다. 들여다보니 화면이 '빠진 것 없음'의 근거를 하나도 주지 않고 있었습니다.

그래서 앞뒤 넉 달에 늘 있던 항목이 이번 달에도 있는지 기계가 먼저 확인하게 했습니다. 그 결과는 확정 버튼 바로 밑에 적힙니다.

우리 회사 마감 파일이라면

본사나 거래처가 보내는 마감 엑셀을 매달 시스템에 올린다면 지난 석 달 파일을 나란히 열어 보세요.

열 이름과 순서, 확장자, 시트 이름이 한 번이라도 바뀌었는지 보면 됩니다.

바뀐 적이 있는데 업로드가 매번 '완료'였다면 그 사이 어딘가에서 반만 들어갔을 수 있습니다. 적재된 행 수와 원본 행 수를 한 번 맞춰 보세요.

이 구조는 프랜차이즈 가맹점 정산이나 대리점 수수료처럼 위쪽이 양식을 쥔 곳이면 똑같이 생깁니다. 받는 쪽이 양식을 정할 수 없으니 적재기가 변화를 다룰 줄 알아야 합니다.

보험대리점 지사라면 적재 뒤에 붙는 실적판과 계약관리까지 GA 지사용 업무 시스템 페이지에 묶어 두었습니다.

지금 받는 마감 파일 몇 달치를 놓고 무엇을 흡수하고 어디서 멈출지 정해 보고 싶다면, 대시보드 제작 상담에 파일 구조부터 적어 주셔도 됩니다.

흡수할 변화, 멈출 변화

아래는 이 지사에서 쓰는 기준입니다. 처음 만들 때는 흡수 칸이 거의 비어 있고, 달이 갈수록 한 번 겪은 변화가 그쪽으로 옮겨 갑니다.

마감 파일에서 생긴 일처리
한 번 겪은 선택 열이 빠지거나 다시 생김흡수, 빈 값으로
수식 오류 칸(#N/A 등)흡수, 빈 값으로(0으로 바꾸지 않음)
빈 헤더 표기, 열 이름 줄바꿈 위치흡수, 이름 정규화
파일명 꼬리 표기 변경흡수, 월은 따로 지정
처음 보는 열, 필수 열 없음멈춤, 무엇이 달라졌는지 보고
같은 계열이 아닌 파일멈춤
적재 뒤 DB 재계수가 다름멈춤, 그 달 전체 되돌림
장부 교차검산 어긋남플래그로 남김
이미 있는 달의 숫자가 바뀜보고만, 고친 칸 기록
봉인한 달손대지 않음
이 달 확정담당자·대표가 누름

이어서 읽기