만들면서 배운 것

엑셀 하나 업로드했는데, 왜 다 깨졌을까 🛠️

답답해하는 초록이 아빠

지난 주말, 초록이 재우고 나서 제 계좌 엑셀 파일 두 개를 돈독에 던져 넣어봤어요.

가계부 앱에서 뽑은 파일, 대차대조표 형식으로 정리한 파일. 둘 다 제가 평소 쓰던 파일이라 당연히 잘 읽힐 줄 알았습니다.

결과는 8개 시트 전부 실패.

왜 이게 필요했나

돈독을 만들 때 제가 처음 세운 원칙은 하나였어요. “흩어진 자산을 한 화면에.”

그런데 이 원칙은 입력이 안 되면 애초에 성립하지 않아요. 은행마다, 증권사마다, 심지어 개인이 쓰는 가계부 양식마다 엑셀 생김새가 다 다르거든요. 어떤 입력이 들어오든 표준 포맷으로 바꿔주는 층 하나가 없으면, 이 앱은 “내 것만 되는 앱”에 머물 수밖에 없었습니다.

그래서 목표를 이렇게 잡았어요. 어떤 모양으로 들어오든 — 엑셀이든, 나중엔 화면 캡처든 — 똑같은 한 형태로 바꿔주는 층을 앞에 두자고요. 그 층만 통과하면 뒤에서는 전부 같은 모양으로 다루면 되니까요.

자신 있다고 말하기 전에, 자신 있는지부터 확인했다

처음엔 은행 6곳 양식을 이미 지원한다고 생각했어요. 코드에도 그렇게 짜여 있었고요.

그런데 하나씩 뜯어보니, 이 6종 지원이 실제 파일로 한 번도 검증되지 않은 상태였습니다. 헤더 이름을 추정해서 짠 코드였던 거예요.

여기서 좀 찔렸습니다. “지원한다”고 홍보부터 하고 나중에 깨지면, 그게 제일 안 좋은 시나리오잖아요. 새는 양동이를 예쁘게 포장해서 파는 셈이니까요.

그래서 순서를 바꿨습니다. 기능을 넓히기 전에, 지금 있는 걸 진짜 파일로 확인부터 하기로요.

실파일 두 개 넣었더니, 8개 시트가 전부 깨졌다

삽질에 멘붕한 초록이 아빠

그렇게 제 실제 파일 두 개를 넣어봤는데, 결과가 위에서 말한 대로예요. 8개 시트 전부 미감지.

이유를 파보니 생각보다 근본적이었습니다. 엑셀을 읽어들이는 코드가 “날짜별로 쭉 나열된 거래 목록”만 있다고 가정하고 있었어요. 은행 앱에서 뽑는 전형적인 내역서 형태죠.

그런데 제 실파일은 완전히 다른 모양이었습니다. 자산과 부채가 좌우로 나뉜 표, 월별 시트가 여러 장 겹친 순자산 기록. 거래 나열이 아니라 어떤 시점의 자산 스냅샷이었어요.

정리하니 문제가 뚜렷해졌습니다. 돈독은 “자산을 한 화면에 보여준다”는 게 핵심인데, 정작 파일을 받아들이는 쪽은 거래 분류에만 맞춰져 있었던 거예요. 앞뒤가 안 맞았죠.

그래서 구조를 다시 짰다

여기서 결정을 하나 내렸어요. 적재 우선순위 1번을 “자산·순자산 트래커”로 명확히 하자.

그리고 읽어들이는 코드를 하나에 몰아넣지 않고, 양식 하나당 담당자 한 명씩 두는 식으로 나눴습니다. 각 담당자는 “이 파일은 내가 읽을 수 있다/없다”만 판단하고, 읽을 수 있으면 자기가 처리해요.

이렇게 해두면 새 양식이 들어와도 담당자를 한 명 더 붙이면 끝입니다. 기존 담당자들과 부르는 쪽 코드는 건드릴 필요가 없어요. (개발에서는 이런 걸 어댑터라고 부릅니다.)

처음엔 제가 자주 쓰는 가계부 양식 하나만 담당자를 붙여 검증했어요. 실파일 27건을 넣고 자산에서 부채를 뺀 값이, 원본 파일의 순자산 합계와 원 단위까지 정확히 맞아떨어지는 걸 확인했습니다. 어긋나면 하나도 없이요.

이게 맞다는 걸 확인한 다음에야, 대차대조표 형식 양식에 두 번째 담당자를 붙였어요.

테스트는 초록불인데, 실제로 눌러보니 또 깨졌다

코드도 통과, 테스트도 통과. 그런데 실제로 앱에서 클릭해보니 또 문제가 나왔어요.

하나는 이름 오해 문제였습니다. 시트 이름에 “가계부”라는 글자만 있으면 무조건 은행 내역서로 착각해버렸어요. 진짜 내용은 자산 표인데 말이죠.

다른 하나는 조용한 덮어쓰기였습니다. 월별 시트가 여러 장 있는 파일을 넣었더니, 시스템이 아무 안내 없이 중간 달 하나만 골라서 현재 잔액을 덮어써버렸어요. 사용자 입장에선 “언제 기준인지”도 모른 채 숫자가 바뀌는 셈이라 제일 위험한 종류의 버그였습니다.

두 문제 다 고쳤어요. 시트 이름이 아니라 실제 내용을 보고 판단하게 하고, 가장 최근 달을 자동으로 골라 배지로 “몇 월 기준”인지 보여주고, 나머지 달들도 버리지 않고 전부 순자산 흐름으로 쌓이게 만들었습니다. 8개월치 파일을 넣었더니 그제야 가입 첫날부터의 순자산 추이가 한 줄 그래프로 그려지더라고요.

지금은 이렇게 씁니다

만드는 법보다 쓰는 법이 궁금하실 것 같아 정리해둘게요. 돈독은 여기 있습니다 — https://don-doc.com

엑셀 일괄 등록 화면 — 파일을 끌어다 놓는 자리 하나가 전부다 올린 파일이 순자산 한 줄과 자산·부채 목록으로 정리된 화면 (돈독 데모 화면, 시연용 데이터)

하나, 파일을 그대로 올립니다. 양식을 맞출 필요가 없어요. 은행에서 받은 내역서든, 직접 쓰던 가계부든, 대차대조표 형식이든 그냥 끌어다 놓으면 됩니다. 어느 양식인지는 담당자가 알아서 판단합니다.

둘, 자산 다섯 갈래로 정리됩니다. 현금·금융투자·부동산·연금·부채. 여기서 부채를 뺀 값이 순자산이고, 그게 한 화면에 뜹니다. 앱 대여섯 개를 오갈 필요가 없어지는 지점이에요.

갈래별로 나눠 보는 화면 — 금융·부동산·연금·부채 (돈독 데모 화면 · 시연용 데모 데이터, 실제 보유 종목·수익률 아님)

셋, 월별 시트가 여러 장이어도 됩니다. 처음엔 이게 문제였는데 지금은 오히려 장점이 됐어요. 가장 최근 달을 현재 잔액으로 잡고, 나머지 달은 버리지 않고 순자산 흐름으로 쌓습니다. 8개월치 파일을 넣으면 8개월치 추이가 한 줄 그래프로 그려져요.

언제 기준 숫자인지는 화면에 배지로 표시됩니다. 이게 없으면 “내 돈이 왜 이렇게 바뀌었지” 하고 놀라게 되거든요.

화면 캡처 이미지도 받기 시작하긴 했어요. 다만 아직 제 파일로만 돌려본 단계라, 된다고 말하는 건 조금 더 써보고 하려고 합니다. 이 글에서 배운 게 딱 그거였으니까요.

같은 걸 만들고 있다면, 저라면 여기부터 봅니다

남의 파일을 받아들이는 층은 어느 앱에나 있습니다. 가계부든, 재고 관리든, 사내 툴이든요. 제가 두 번 데인 자리는 이 두 곳이었어요.

먼저 판별을 이름으로 하는지, 내용으로 하는지 보세요. 시트 이름이나 파일명에 특정 단어가 있으면 어떤 양식이라고 단정하는 코드가 있다면, 사용자가 파일 이름을 바꾸는 순간 무너집니다. 이름은 힌트로만 쓰고, 실제로 어떤 열이 들어 있는지를 보고 판단하게 바꾸는 게 먼저였습니다.

그다음은 덮어쓰기 전에 언제 기준인지 말해주는가입니다. 잔액을 갱신하는 기능이라면 어느 시점 숫자로 덮는지 화면에 남겨야 해요. 조용히 바뀐 숫자는 틀린 숫자보다 더 나쁩니다. 사용자는 그걸 버그로 인식하지 못하고, 자기 기억을 의심하거든요.

두 가지 다 코드가 아니라 화면에서 드러납니다. 그래서 지원 목록을 늘리기 전에 실제 파일부터 넣어봐야 합니다. 저는 여섯 곳을 지원한다고 적어두고, 정작 제 파일 8개 시트를 전부 실패했으니까요.

뿌듯했던 순간과, 그보다 크게 남은 교훈

뿌듯해하는 초록이 아빠

실제 파일로 계좌 24개가 생성되고, 6개월치 순자산 그래프가 한 번에 그려지는 걸 봤을 때는 확실히 뿌듯했어요.

그런데 이번에 더 오래 남은 건 다른 거였습니다. 코드와 테스트가 모두 초록불이어도, 새로운 형태의 데이터가 들어오는 화면은 결국 직접 눌러봐야 드러난다는 것.

그리고 “이 기능 됩니다”라고 말할 자격은, 화려한 지원 목록이 아니라 실제로 검증된 만큼에서만 나온다는 것도요.

다음엔 정해진 양식이 아니라 아예 낯선 엑셀을 AI가 알아서 읽어내는 단계를 시도해보려고 합니다. 그 얘기는 또 다음 빌드로그에서요.

오늘도 한 걸음. 🐴

이 글은 산업 구조와 만드는 과정을 정리한 개인 기록입니다.
특정 종목의 매수·매도 추천이 아니며, 투자 판단과 그 결과는 독자 본인에게 있습니다.

← 글 목록으로