SSELMOISS STORIES

쓸모있는 이야기를 나누는 블로그

일상에서 발견한 정보와 경험을 읽기 편한 글로 만나보세요.

최신 글

바이브코딩으로 나에게 꼭 맞는 가계부 앱을 만든 과정

카드 알림 수집부터 명세서 OCR, 현금 지출, 예산 비교까지 대화형 AI 코딩으로 개인용 안드로이드 가계부를 단계적으로 완성한 기록입니다.

바이브코딩으로 나에게 꼭 맞는 가계부 앱을 만든 과정

시중에는 완성도 높은 가계부 앱이 많지만, 제가 원한 사용 방식과 정확히 맞는 앱을 찾기는 어려웠습니다. 카드사마다 승인 기간이 다르고, 카드 알림뿐 아니라 현금 지출과 고정비도 한 화면에서 보고 싶었습니다. 과거 사용 내역은 명세서 이미지에서 가져오되, 금융 정보가 외부 서버로 전송되지 않기를 원했습니다.

그래서 대화형 AI에게 원하는 기능을 설명하고, 만들어진 앱을 실제 휴대전화에서 사용하면서 문제를 다시 전달하는 방식으로 개인용 안드로이드 가계부를 만들었습니다. 흔히 말하는 ‘바이브코딩’이었지만, 단순히 한 번의 프롬프트로 앱이 완성된 것은 아니었습니다. 요구사항을 작게 나누고, 실행 결과를 확인하고, 숫자가 맞지 않으면 원인을 찾아 테스트를 추가하는 반복 작업에 가까웠습니다.

※ 이 글에 사용한 화면에서는 개인정보와 실제 금액을 모두 삭제했습니다. 막대 높이로 금액을 추정할 수 있는 그래프 영역도 함께 가렸습니다.

시작은 “한눈에 보고 싶다”였습니다

첫 목표는 단순했습니다. 월 예산, 현재 승인 기간의 카드 사용액, 이번 달 현금 지출, 현재 소비 상태를 첫 화면에서 바로 확인하는 것이었습니다. 하단에는 요약·카드·현금·예산·가져오기 메뉴를 두어 각 기능을 별도 화면으로 나눴습니다.

초기 버전은 카드 알림을 읽어 승인 금액을 저장하는 작은 MVP였습니다. 안드로이드의 알림 접근 기능을 이용하되, 신한·현대·우리카드처럼 제가 지정한 카드사의 새 결제 알림만 처리하도록 범위를 좁혔습니다. 은행 로그인, 계좌 접근, 문자와 연락처 읽기, 광고 SDK, 서버 전송은 의도적으로 제외했습니다. 알림 원문과 정리된 내역은 기기 내부에만 보관하도록 설계했습니다.

이 원칙은 기능보다 먼저 정했습니다. 가계부는 민감한 생활 패턴을 담기 때문에 편리함을 이유로 불필요한 권한을 추가하지 않는 것이 중요했습니다.

카드별 승인 기간이 첫 번째 난관이었습니다

카드 사용액을 달력의 1일부터 말일까지 단순 합산하면 실제 카드 청구 흐름과 맞지 않았습니다. 카드마다 승인 기간과 결제일이 달랐기 때문입니다. 그래서 카드별 승인 기간을 따로 계산하고, 이전 기간과 다음 기간을 이동하면서 내역을 확인할 수 있게 만들었습니다.

알림에서 들어온 승인 내역과 명세서 이미지에서 가져온 내역이 같은 거래라면 한 번만 계산해야 합니다. 반대로 같은 상점에서 같은 금액을 여러 번 결제한 정상 거래까지 중복으로 지우면 안 됩니다. 이 차이를 구분하는 작업이 화면을 만드는 일보다 훨씬 어려웠습니다.

결국 데이터의 출처, 카드사, 승인 기간, 거래 시점과 금액을 함께 비교하도록 규칙을 다듬었습니다. 요약 화면의 카드 합계와 카드 상세 화면의 합계가 항상 같은 기준을 사용하도록 계산 로직도 하나로 모았습니다.

과거 내역을 위해 명세서 이미지 OCR을 추가했습니다

알림 접근 기능은 앱을 설치한 이후의 새 알림에는 유용하지만, 이미 지나간 내역을 자동으로 되살릴 수는 없습니다. 이를 보완하려고 카드사 앱의 승인내역이나 명세서 캡처 이미지를 불러오는 기능을 추가했습니다.

사용자가 먼저 카드사를 선택한 뒤 이미지를 고르면, 한국어 OCR이 기기 안에서 실행됩니다. 확인하기 전에는 결과를 저장하지 않도록 했고, 다른 카드사를 새로 선택했을 때 이전 OCR 결과가 남아 섞이지 않도록 상태도 초기화했습니다. 카드사마다 명세서 배치와 표현이 달라 한 번에 해결되지는 않았습니다. 날짜와 금액의 화면상 위치를 짝짓는 규칙, 펼쳐진 메뉴가 거래 행을 가리는 경우, 취소 문구를 구분하는 경우를 실제 캡처로 반복 보완했습니다.

예산표와 현금 지출도 연결했습니다

카드 금액만 모아서는 생활비 전체를 볼 수 없었습니다. 기존에 사용하던 Google Sheets 예산표를 읽어 월 기준 예산과 세부 항목을 가져오도록 했습니다. 단순히 큰 분류의 합계만 표시하지 않고, 보험·통신·식비처럼 실제로 관리하는 행 단위 항목까지 확인하고 수정할 수 있게 만들었습니다.

현금 지출은 고정비와 일회성으로 나눴습니다. 고정비는 다음 달에도 이어지고, 일회성 지출은 해당 월에만 남도록 처리했습니다. 추가·수정·삭제 결과가 요약과 월별 그래프에 즉시 반영되도록 같은 데이터 흐름을 사용했습니다. 마지막에는 최근 여러 달의 카드와 현금을 함께 비교하고, 예산보다 절약 중인지 초과 중인지 문장으로 보여주도록 확장했습니다.

바이브코딩에서 가장 중요했던 것은 검증이었습니다

AI는 화면과 기능을 빠르게 만드는 데 큰 도움이 됐지만, 금융 앱의 숫자가 맞는지는 사람이 요구사항을 명확히 정하고 검증해야 했습니다. 특히 다음 항목은 자동 테스트로 남겼습니다.

• 카드별 승인 기간 경계 계산

• 카드 알림 문구와 원화 금액 파싱

• 명세서 OCR의 날짜·금액 연결

• 이미지와 알림 사이의 중복 제거

• 반복된 정상 결제를 보존하는 규칙

• 고정비와 일회성 현금 지출의 월 이동

• 요약·상세·월별 차트가 같은 합계를 사용하는지

• 예산표의 세부 항목 합과 전체 합이 일치하는지

수정 전에는 소스 백업을 만들고, 기능을 고친 뒤에는 단위 테스트와 실제 APK 설치 테스트를 반복했습니다. 한 화면에서 숫자가 맞아 보여도 다른 화면의 계산 기준이 다를 수 있기 때문에, ‘보이는 결과’와 ‘계산 규칙’을 함께 검사하는 것이 필요했습니다.

완성보다 사용하면서 진화하는 앱

이번 작업을 통해 느낀 바이브코딩의 장점은 개발 속도보다도 생각을 바로 제품으로 시험해 볼 수 있다는 점이었습니다. “현금도 같이 보고 싶다”, “고정비는 다음 달로 이어져야 한다”, “카드사별 승인 기간이 달라야 한다” 같은 생활 속 요구를 말로 정리하면 빠르게 시제품으로 만들 수 있었습니다.

반면 AI가 만들어 준 첫 결과를 그대로 믿으면 안 됐습니다. 개인정보 보호 범위, 숫자의 정의, 중복 처리, 기존 기능 회귀 여부는 반복해서 확인해야 했습니다. 결국 좋은 결과를 만든 것은 멋진 한 줄 프롬프트가 아니라 작은 요구사항, 실제 데이터로 발견한 오류, 백업, 테스트, 재검증의 순환이었습니다.

아직 모든 사람을 위한 범용 가계부는 아니지만, 제가 실제로 필요로 한 흐름을 담은 개인 도구가 되었습니다. 바이브코딩은 개발을 대신해 주는 마법이라기보다, 사용자가 문제를 구체적으로 설명하고 검증할 때 훨씬 강력해지는 제작 방식에 가까웠습니다.