요구된 표의 컬럼이 데이터보다 2년 길었습니다 — 빈 칸 대신 컬럼을 없앴습니다
재무회계 담당 부서가 엑셀로 관리하던 표가 하나 있었습니다. 거래처별로 한 줄, 연도별로 한 칸씩 미수채권 잔액을 적는 표입니다. 이 표를 시스템 화면으로 옮겨달라는 요청이 들어왔습니다.
프랜차이즈 ERP 를 운영하던 중이었고, 채권 데이터는 외부 회계 SaaS 에서 막 수집을 시작한 참이었습니다. 받은 엑셀 양식을 열어보니 연도 컬럼이 2023년부터 시작했습니다. 표를 쓰던 사람에게는 당연한 시작점입니다. 그 해부터 미수가 쌓인 거래처가 있고, 그걸 계속 추적해 왔기 때문입니다.
채울 수 없는 칸이 첫 결정이었습니다
문제는 원천이었습니다. 회계 SaaS 에 있는 데이터는 2025년분부터였습니다. 그 이전은 회계 시스템을 도입하기 전이라, 별도 소스를 붙이지 않는 한 채울 방법이 없습니다. 요청받은 표의 컬럼이 데이터 보유 기간보다 2년 길었습니다.
사람이 요청하는 표는 업무의 역사를 기준으로 그려집니다. 시스템의 데이터는 도입 시점부터 존재합니다. 이 둘이 어긋나는 구간은 구현으로 메울 수 없습니다. 이번 작업의 첫 결정은 이 구간을 화면에서 어떻게 다룰 것인가였습니다.
빈 칸을 둘 것인가, 컬럼을 없앨 것인가
세 가지를 놓고 봤습니다.
선택지 | 결과 | 문제 |
|---|---|---|
요구 양식 그대로 — 2023·2024 컬럼을 두고 빈 값 | 양식과 화면이 같아 보입니다 | 왜 비었는지가 화면에 없습니다. 수집 실패로 읽힙니다 |
있는 연도만 하드코딩 | 지금은 맞습니다 | 해가 바뀔 때마다 코드를 고쳐야 합니다 |
데이터가 있는 연도부터 올해까지 동적 생성 (채택) | 채울 수 있는 칸만 만들어집니다 | 연도가 쌓이면 표가 가로로 길어집니다 |
첫 번째를 고르지 않은 이유는 빈 칸이 늘 장애로 읽히기 때문입니다. 표를 보는 사람은 2023년이 회계 시스템 도입 전이라는 사실을 모릅니다. 그 사람 눈에는 채워져야 할 칸이 비어 있는 것이고, 문의는 개발자에게 옵니다.
컬럼 자체를 없애면 '왜 2023년이 없느냐'는 질문이 나옵니다. 같은 질문처럼 보이지만 성격이 다릅니다. 앞의 것은 장애 문의이고, 뒤의 것은 데이터의 경계를 두고 시작되는 논의입니다.
그래서 표의 컬럼을 원천에서 뽑게 했습니다. 전기이월 값이 들어오는 첫 연도부터 올해까지를 조회 시점에 계산해 컬럼을 만듭니다. 지금은 2025·2026 두 칸이지만 해가 바뀌면 칸이 하나 늘어납니다. 채울 수 없는 과거 연도는 표에서 사라졌고, 그 이유는 운영 문서에 남겼습니다.

연초에 뽑은 작년 값은 아직 확정이 아닙니다
회계 데이터에는 일반 업무 데이터와 다른 성질이 하나 있습니다. 과거 연도의 값이 시간이 지나야 확정된다는 점입니다. 회계는 연마감을 하고 전기이월을 넘겨야 다음 기수의 기초 잔액이 정해집니다. 마감 전에 뽑은 작년 잔액은 잠정치입니다.
이 표는 연도별 잔액을 보여주는 표라 이 성질에 정면으로 걸립니다. 1월에 조회한 작년 컬럼과 마감 후 다시 수집한 작년 컬럼은 값이 다를 수 있습니다. 같은 질의가 시점에 따라 다른 답을 주는 데이터입니다. 마감 이후 재수집이 필요하다는 것을 운영 주의사항으로 남겼습니다.
회계 원천과 우리 DB 를 거래처 코드로 붙였습니다
회계 SaaS 에서 오는 것은 채권 금액과 거래처 정보뿐입니다. 표에 필요한 나머지 네 가지, 담당 슈퍼바이저·보증금·폐점 여부·계약상 월 로열티는 전부 우리 DB 의 매장·계약·임대·회원 데이터입니다. 표 한 줄은 거래처 코드 매핑을 축으로 두 세계를 조인한 결과입니다.
매핑이 없는 거래처가 있습니다. 이 경우 내부 정보 칸을 공백으로 남겼습니다. 추정값이나 대시로 메우면 화면은 깔끔해지는데, 매핑이 빠졌다는 사실이 화면에서 사라집니다. 공백은 보기에 불편하지만 '이 거래처는 아직 우리 매장과 연결되지 않았다'를 그대로 말해줍니다.

값이 있는데도 쓸 수 없는 컬럼이 있었습니다
상세 화면에 개점·폐점 상태 컬럼을 넣으려다 뺐습니다. 회계 원천에 거래처의 사용 여부 플래그가 있어서 그걸 쓰려던 것입니다. 실제 값을 보니 폐점한 거래처도 계속 '사용'으로 남아 있었습니다. 회계 쪽에서는 채권이 남아 있는 한 그 거래처는 계속 거래처이기 때문입니다.
우리가 원한 건 '영업 중인가'였고, 원천이 준 건 '회계상 살아 있는가'였습니다. 이름이 비슷하다고 매핑하면 값이 채워진 컬럼이 생깁니다. 값이 있으니 아무도 의심하지 않고, 그래서 더 위험합니다.
이런 컬럼은 비워두지 않고 지웠습니다. 비워두면 '언젠가 채워지겠지'가 되고, 지우면 '왜 없느냐'를 묻는 사람이 생겨 이유를 설명할 자리가 생깁니다. 다만 그 질문을 반복해서 받게 되므로, 없는 이유를 화면 어딘가에 적어두는 편이 낫습니다.
원천이 값을 준다고 그 값이 우리 뜻과 같은 것은 아니라는 점은 이 프로젝트에서 한 번 더 겪었습니다. 매출 합계가 늘 1.37% 부족했던 것도 원천 API 가 특정 상품을 빼고 주고 있었기 때문이었습니다.

요약에서 원장까지 한 번의 클릭
화면은 두 층입니다. 목록은 거래처 × 연도 피벗이고, 세 계정과목을 합산한 잔액이 셀에 들어갑니다. 행을 누르면 거래원장 팝업이 뜹니다. 날짜·적요·차변·대변·누적 잔액·전표번호를 전기이월부터 쌓아 보여주고, 월이 바뀌는 자리에 굵은 선을 넣었습니다.
요약에서 이상한 숫자가 보이면 그 자리에서 원장까지 내려갈 수 있습니다. 합계가 이상해 보일 때 다른 도구를 열어야 하는 화면은 확인용으로 쓰이지 않습니다. 나머지는 작은 결정들입니다.
한 매장이 여러 거래처 코드를 갖는 경우가 있어 매장명 셀을 세로로 병합했습니다. 누르면 매장 상세가 뜹니다
거래처 코드는 뒤 6자리만 보여줍니다. 앞자리가 전부 같아 화면 폭만 먹습니다
연도 드롭다운과 계정과목 체크박스는 서버 조회 조건으로, 잔액 1 이상만 보기는 클라이언트 필터로 뒀습니다. 앞의 둘은 받아올 데이터 양이 갈리고, 뒤는 이미 받은 것을 줄이는 일입니다
표를 옮기기 전에 맞대볼 것
이번 작업에서 남은 패턴은 하나로 모입니다. 사람은 업무의 역사로 표를 그리고, 시스템은 도입일부터 데이터를 갖습니다. 이 차이는 구현 중에 발견하면 늦습니다. 요구 확인 단계에서 표의 기간과 원천의 보유 기간을 나란히 놓고 보는 것이 먼저입니다.
요구된 표의 첫 컬럼과 원천의 첫 데이터 날짜를 맞대봤는가
채울 수 없는 칸은 만들지 않았는가. 만들었다면 왜 비었는지를 화면이 말하는가
시점에 따라 값이 바뀌는 데이터라면 '언제 기준'이 화면이나 문서에 있는가
원천 필드의 이름이 아니라 실제 값의 분포를 보고 우리 의미와 같은지 확인했는가
매칭 실패를 기본값으로 덮지 않고 공백으로 드러냈는가
이 결정에는 미룬 것이 있습니다. 과거 연도를 정말 채워야 하는 요구라면 이전 시스템에서 옮겨오는 작업이 따로 필요합니다. 동적 컬럼도 5년쯤 쌓이면 가로 폭이 문제가 됩니다. 매핑률이 낮은 초기에는 공백이 많은 표가 신뢰를 얻기 어렵습니다. 매핑 작업과 순서를 맞추는 것이 그 대비입니다.
표는 화면으로 들어갔고, 채울 수 없는 칸은 표 밖으로 나갔습니다. 그 이유는 코드가 아니라 문서에 남아 있습니다.