영수증을 캡처하고 OCR로 데이터를 추출해 지출을 분류하고 회계 도구로 내보내는 모바일 앱을 만드는 실무 가이드.

기능이나 화면을 고르기 전에 당신이 해결하려는 문제를 구체화하세요. 단순히 “지출 추적”이라 표현하면 범위가 너무 넓습니다. 실제 고통은 보통 영수증 분실, 수작업 입력의 번거로움, 지연된 환급에 있습니다.
한 문장으로 된 문제 진술을 써서 모든 결정에 대해 테스트하세요:
“사람들이 몇 초 안에 영수증을 캡처하고, 이를 완전한 비용 항목으로 자동 전환해 누락된 항목 없이 제출할 수 있게 돕는다.”
이 진술은 범위를 통제하고 앱이 범용 재무 도구로 흐르는 것을 막아줍니다.
대부분의 디지털 영수증 앱은 여러 사용자층을 다룹니다:
우선 기본 사용자를 정하세요(보통 직원 또는 프리랜서). 재무팀 경험은 핵심 워크플로우가 아니라 “검토 레이어”로 설계하세요.
초기 버전은 작은 결과 집합에 집중하세요:
실제 가치를 반영하는 몇 가지 지표에 합의하세요:
목표, 사용자, 작업, 지표가 명확하면 나머지 결정은 추측이 아닌 합리적 트레이드오프가 됩니다.
기능이나 화면을 고르기 전에 앱이 지원해야 할 끝에서 끝 여정을 적으세요. 명확한 워크플로우는 “영수증 스캔”이 분리된 도구들의 모음이 되는 것을 방지합니다.
최소한 다음 전체 경로를 매핑하세요:
각 단계마다 사용자가 보는 화면, 생성되는 데이터, 자동으로 처리되어야 하는 부분(예: 합계 계산, 통화 정규화, 세금 감지)을 기록하세요.
주요 진입점을 결정하면 UI와 백엔드 가정이 형성됩니다:
MVP에는 한 가지 ‘기본 시작’을 선택하고 나머지는 보조 경로로 지원하세요.
누가 무엇을 할 수 있는지 명확히 하세요:
인수 규칙을 초기에 설계하세요(예: 비용이 언제 읽기 전용이 되는지, 누가 재작성 가능한지, 변경이 어떻게 기록되는지).
문제 상황을 문서화하세요: 반품/환불, 분할 계산, 다중 통화, 팁, 영수증 누락, 일당(per diem) 등. v1에서 완전 자동화하지 않더라도 사용자 흐름을 막지 않는 분명한 경로가 있어야 합니다.
좋은 데이터 모델은 검색 속도, 수작업 감소, 회계로의 깔끔한 내보내기를 쉽게 만듭니다. 핵심은 사용자가 캡처한 것(원본 파일)과 앱이 이해한 것(정규화된 필드)을 분리하는 것입니다.
**Receipt(영수증)**를 증빙(파일과 추출 결과)로, **Expense(비용)**를 환급·정책 검사·보고에 쓰이는 비즈니스 레코드로 취급하세요.
하나의 비용은 하나의 영수증을 가질 수도, 여러 영수증(분할 결제)을 가질 수도, 또는 영수증이 없을 수도 있으니 유연한 관계로 모델링하세요.
capture_method 필드를 계획해 카메라 스캔을 넘어 확장하세요:
이 필드는 품질 문제를 조사하고 이후 OCR/파싱을 조정할 때도 유용합니다.
최소한 Expense에 다음을 저장하세요(비록 OCR에서 가져오더라도): 상점(merchant), 날짜, 총액, 세금, 통화, 결제수단. 편집을 되돌릴 수 있고 설명 가능하도록 원시 텍스트와 정규화된 값(예: ISO 통화 코드, 파싱된 날짜)을 모두 보관하세요.
또한 다음과 같은 메타데이터를 저장하세요:
merchant_normalized(일관된 검색을 위해)transaction_last4 또는 토큰화된 카드 참조(중복 방지용)timezone 및 locale(날짜/세금 파싱 정확도 보정)원본 이미지/PDF는 추출/정규화된 데이터와 별도로 보관하세요. 이렇게 하면 원본을 잃지 않고 나중에 재처리할 수 있습니다.
사용자들이 실제로 묻는 질문에 맞게 검색을 설계하세요:
이 필드들을 초기에 인덱싱하면 “계속 스크롤” 대신 즉각적인 답변을 제공할 수 있습니다.
스키마에 보존 제어를 포함하세요:
이 요소들이 있으면 개인용 캡처에서 회사 전체의 규정 준수까지 확장할 수 있습니다.
영수증 캡처는 사용자가 앱을 편리하다고 느낄지 귀찮다고 느낄지를 결정하는 순간입니다. 카메라를 사진 도구가 아니라 “스캐너”로 취급하세요: 기본 경로를 빠르고 안내적이며 관대한 흐름으로 만드세요.
라이브 엣지 감지와 자동 자르기를 사용해 사용자가 완벽하게 프레이밍할 필요가 없게 하세요. 미묘하고 실행 가능한 힌트(“가까이 대세요”, “그림자 피하세요”, “고정하세요”)와 용지 반짝임이 심할 때의 경고를 추가하세요.
호텔 명세서나 긴 항목표를 위해 다중 페이지 캡처를 지원하세요. 사용자가 한 흐름에서 페이지를 계속 촬영하고 마지막에 확인하도록 하세요.
작은 전처리가 OCR 엔진을 바꾸는 것보다 정확도를 더 향상시키는 경우가 많습니다:
이 파이프라인을 일관되게 실행해 OCR이 예측 가능한 입력을 보도록 만드세요.
디바이스 OCR은 속도, 오프라인 사용, 프라이버시에 유리합니다. 클라우드 OCR은 저품질 이미지나 복잡한 레이아웃에 더 나을 수 있습니다. 실용적인 방법은 하이브리드입니다:
업로드를 유발하는 조건을 투명하게 표시하고 사용자가 제어할 수 있게 하세요.
우선 높은 가치 필드에 집중하세요: 상점, 날짜, 통화, 총액, 세금, 팁. 라인 아이템은 유용하지만 훨씬 어렵습니다—이는 개선 기능으로 간주하세요.
필드별 신뢰도 점수를 저장하세요. 이렇게 하면 “합계 불확실”처럼 사용자가 확인해야 할 부분만 강조할 수 있습니다.
스캔 후 빠른 검토 화면을 제공해 원클릭 수정(총액 편집, 날짜 설정, 상점 변경)을 허용하세요. 사용자의 수정은 학습 신호로 캡처하세요: 사용자가 반복적으로 특정 오류를 수정하면 추출이 그 패턴을 학습하고 개선될 수 있습니다.
좋은 캡처는 절반의 일입니다. 깔끔한 비용 관리를 위해 빠른 분류, 유연한 메타데이터, 강력한 중복 방지가 필요합니다.
이해하기 쉽고 관리자가 관리할 수 있는 결정론적 규칙으로 시작하세요. 예: “Uber → 교통”, “Starbucks → 식음료”, “USD + 공항 상점 코드 → 출장”. 규칙은 예측 가능하고 감사하기 쉬우며 오프라인에서도 작동합니다.
그 위에 속도를 높이기 위한 ML 기반 제안을 추가하세요(선택 사항). UI는 제안된 카테고리와 그 이유(예: “상점 기반”)를 보여주고 사용자가 한 번의 탭으로 무시할 수 있게 명확해야 합니다.
세 번째 가속 수단은 사용자 즐겨찾기입니다: 상점별 최근 카테고리, 고정된 카테고리, “이 프로젝트에서 마지막으로 사용된 카테고리” 등. 실제 환경에서 복잡한 AI보다 더 높은 성능을 보이는 경우가 많습니다.
대부분의 조직은 카테고리 이상이 필요합니다. 프로젝트, 비용 센터, 클라이언트, 정책 태그(예: 청구 가능, 개인, 정기) 같은 커스텀 필드를 만들고 워크스페이스별로 구성 가능하게 하세요. 필수/선택 규칙도 정책에 따라 설정하세요.
분할은 일반적입니다: 호텔 요금을 여러 프로젝트로 나누거나 단체 식사를 참석자별로 나누는 경우.
하나의 비용을 서로 다른 카테고리/프로젝트/참석자 등으로 여러 라인으로 분할할 수 있게 지원하세요. 공동 결제의 경우 “결제자”를 표시하고 지분을 할당할 수 있게 하되 하나의 원본 영수증을 유지하세요.
저장 시와 제출 시 정책 검사를 실행하세요:
중복을 위해 여러 신호를 결합하세요:
가능한 중복을 감지하면 즉시 차단하지 말고, 나란히 비교하는 “검토”를 제공하고 안전한 “둘 다 유지” 옵션을 두세요.
영수증·비용 앱은 신뢰성에 따라 성공하거나 실패합니다: 지하 카페에서 캡처해도 사라지지 않고 나중에 재무팀이 요청할 때 찾을 수 있어야 합니다. 초기 아키텍처 결정이 일상 경험을 결정합니다.
MVP에서는 출시 속도와 네이티브 경험 중 무엇을 최적화할지 결정하세요.
영수증 캡처는 연결이 불안정한 곳에서 일어납니다. 휴대폰을 1차 저장소로 취급하세요.
로컬 큐를 사용하세요: 사용자가 영수증을 제출하면 이미지 + 초안 비용을 로컬에 저장하고 “대기중”으로 표시한 뒤 나중에 동기화합니다. 재시도(지수 백오프)를 계획하고 동기화 충돌을 어떻게 처리할지 규칙을 정의하세요(예: 서버 우선, 최신 우선, 드물게 사용자에게 묻기).
대부분 팀은 백엔드를 필요로 합니다:
이 서비스를 모듈화하면 OCR 공급자를 교체하거나 파싱을 개선할 때 앱을 재구축할 필요가 없습니다.
사람들이 “Uber”를 검색하거나 “3월 식비”로 필터링할 때 인덱스가 중요합니다. 정규화된 상점 이름, 날짜, 총액, 통화, 카테고리, 태그를 저장하고 일반 쿼리(날짜 범위, 상점, 카테고리, 상태)에 대한 인덱스를 추가하세요. “영수증 저장 및 검색”이 핵심 가치라면 가벼운 검색 레이어를 고려하세요.
지원되는 경우 백그라운드 동기화를 사용하되 이것에 전적으로 의존하지 마세요. 명확한 앱 내 동기화 상태를 표시하고 OCR 준비 완료, 영수증 거절, 비용 승인 같은 이벤트에 대해 푸시 알림을 고려해 사용자가 앱을 계속 확인하지 않도록 하세요.
캡처 → OCR → 검토 → 제출 루프를 빠르게 검증하려면 커스텀 빌드에 투자하기 전에 프로토타입으로 빠르게 검증하세요. 예를 들어 Koder.ai 같은 채팅 기반 코드 생성 플랫폼은 웹 관리자 패널과 백엔드 서비스(예: React 관리 콘솔 + Go + PostgreSQL API)를 빠르게 프로토타입하고 테스트하면서 스냅샷으로 롤백할 수 있어 초기 반복에 유용합니다.
영수증과 비용에는 이름, 카드 일부, 주소, 이동 패턴, 때로는 세금 ID 같은 민감한 데이터가 포함됩니다. 보안과 프라이버시는 준수 체크박스가 아니라 제품 기능으로 다루세요.
앱 배포 방식에 맞는 로그인 방법을 선택하세요:
모든 네트워크 호출에 TLS를 사용하고 민감 데이터는 서버에서 암호화하세요. 영수증은 이미지/PDF로 저장되는 경우가 많으니 미디어 저장소는 DB 레코드와 분리해(프라이빗 버킷, 단기 서명 URL, 엄격한 접근 정책) 보호하세요.
디바이스에는 가능한 한 적게 캐시하세요. 오프라인 저장이 필요하면 로컬 파일을 암호화하고 OS 수준 보안(생체/암호)으로 접근을 보호하세요.
초기에 역할을 정의하고 권한을 명확히 하세요:
감사자에게는 ‘보기 전용’ 접근을 제공하고 의료와 같은 민감 카테고리에 대한 가시성을 제한하는 가드레일을 추가하세요.
필요한 정보만 수집하세요. 전체 카드 번호나 정확한 위치가 필요 없다면 저장하지 마세요. 무엇을 추출하는지, 얼마나 오래 보관하는지, 사용자가 데이터를 어떻게 삭제할 수 있는지 명확히 알리세요.
핵심 작업(금액·카테고리 편집, 승인 상태 변경 등)에 대해 누가 언제 무엇을, 왜 변경했는지 기록하는 감사 로그를 유지하세요. 이는 분쟁 해결, 규정 준수 검토, 통합 문제 해결에 필수적입니다.
우수한 영수증·비용 앱은 지름길처럼 느껴집니다: 사용자가 몇 초만에 캡처하고 몇 분을 고치지 않게 만드는 것이 목표입니다. 목표는 “내가 지불했다”를 “제출 준비 완료”로 최소 탭으로 바꾸는 것입니다.
대부분 팀은 다음 여섯 화면으로 실제 사용의 90%를 커버할 수 있습니다:
이 화면들을 단일 흐름으로 설계하세요: 캡처 → 검토 → 목록에 자동 저장 → 준비되면 제출.
한 손 조작을 우선시하세요: 큰 셔터 버튼, 손이 닿기 쉬운 컨트롤, 명확한 “완료” 액션. 반복 입력을 막기 위해 스마트 기본값을 적용하세요—기본 통화, 결제수단, 프로젝트/클라이언트, 자주 쓰는 카테고리 자동 입력 등.
검토 화면에서는 칩(chips)과 빠른 액션(예: 카테고리 변경, 분할, 참석자 추가)을 사용하세요. 인라인 편집은 별도의 편집 페이지로 넘어가게 하는 것보다 우수합니다.
사용자는 자동화된 결과를 이해하지 못하면 받아들이지 않습니다. 추출된 필드(상점, 날짜, 총액)를 강조하고 제안의 이유를 짧게 표시하세요:
신뢰도가 낮은 필드에는 시각적 표시(예: 확인 필요)를 두어 사용자가 어디를 확인해야 할지 알게 하세요.
캡처 품질이 낮을 때 단순히 실패 처리하지 마세요. 구체적인 안내를 제시하세요: “영수증이 흐립니다—가까이 대세요” 또는 “너무 어두움—플래시를 켜세요”. OCR이 실패하면 재시도 상태와 빠른 수동 대체 입력(누락 필드만)을 제공하세요.
읽기 쉬운 타이포그래피, 강한 대비, 큰 탭 영역을 사용하세요. 메모와 참석자에 대한 음성 입력을 지원하고 오류 메시지가 스크린 리더로 읽히는지 확인하세요. 접근성은 추가 기능이 아니라 마찰을 줄이는 핵심입니다.
앱이 진짜 유용해지려면 비용이 검토, 환급, 회계로 최소한의 커뮤니케이션으로 이동해야 합니다. 이를 위해 명확한 승인 단계, 즉시 제출 가능한 보고서, 재무팀이 이미 사용하는 도구와의 통합이 필요합니다.
워크플로우는 단순하고 예측 가능하며 가시적이어야 합니다. 전형적인 흐름:
세부 설계가 중요합니다: “마지막 제출 이후 무엇이 변경되었나” 표시, 특정 라인 아이템에 대한 인라인 코멘트 허용, 모든 상태 전환(제출 → 승인 → 내보냄 등) 저장. 또한 승인이 비용 단위인지 보고서 단위인지 또는 둘 다인지 초기에 결정하세요—재무팀은 보통 보고서 단위 승인을 선호하지만 관리자는 라인 아이템을 Spot-check 하길 원할 수 있습니다.
사용자가 수작업으로 보고서를 재구성하지 않도록 일반적인 내보내기를 지원하세요:
PDF 패킷을 제공하면 요약 페이지가 재무팀 기대치와 일치하도록 만드세요: 카테고리·통화·세금·정책 플래그별 합계(예: “영수증 누락”, “한도 초과”).
QuickBooks, Xero, NetSuite 같은 인기 플랫폼과의 통합은 보통 비용/청구서 생성, 영수증 파일 첨부, 필드 매핑(공급자/상점, 날짜, 금액, 계정/카테고리, 세금)으로 요약됩니다. 당장 네이티브 통합을 제공하지 못해도 일반 웹훅/API를 제공해 팀이 자체 워크플로우에 연결할 수 있게 하세요.
지원 요청을 줄이려면 매핑을 구성 가능하게 하세요: 관리자가 카테고리를 회계 계정에 매핑하고 팀/프로젝트/상점별 기본값을 설정할 수 있게 하세요.
사용자는 “언제 돈을 받나?”를 가장 신경 씁니다. 지급이 급여에서 처리되더라도 앱은 환급 상태를 추적할 수 있습니다:
자동으로 “지급됨”을 확인할 수 없다면 수동 전송 단계나 급여 임포트로 상태를 조정할 수 있게 하세요.
요금제별 포함 항목을 개략적으로 정리하고 /pricing 링크로 기대치를 명확히 하면 독자를 과도한 세부정보로 혼란시키지 않습니다.
경비 앱은 기능 수가 많은 것보다 번거로움을 줄이는 것이 성공의 기준입니다. 가장 작은 유용한 루프부터 시작해 실제 사용자가 하는 실제 보고서로 검증하세요.
완료에 필요한 최소한을 구축하세요: 캡처 → 추출 → 분류 → 내보내기.
즉, 사용자가 영수증을 찍고 핵심 필드(상점, 날짜, 총액)가 채워지는 것을 보고, 카테고리를 선택 또는 확인하고, 보고서를 내보낼(CSV, PDF, 이메일 요약) 수 있어야 합니다. 사용자가 이 루프를 빠르게 마치지 못하면 다른 기능이 도움이 되지 않습니다.
지금 일부러 만들지 않을 항목을 적어 두세요:
명확한 로드맵은 범위 확대를 막고 사용자 피드백을 우선순위화하기 쉽게 만듭니다.
캡처→제출 퍼널을 추적하세요:
실패 순간에 “이 영수증에서 무엇이 불편했나요?” 같은 가벼운 인앱 프롬프트를 달아 정성 피드백을 수집하세요.
다양한 실제 영수증(다른 상점, 글꼴, 언어, 구겨진 사진)을 포함한 작고 대표적인 테스트셋을 구축해 평가와 회귀 테스트에 사용하세요. OCR 품질이 조용히 저하되는 것을 막을 수 있습니다.
소규모 팀으로 1–2 회차의 비용 제출을 파일럿하세요. 사용자가 추출된 필드를 수정하고 카테고리 지정하게 하고, 그 수정을 라벨된 학습/품질 데이터로 취급하세요. 목표는 완벽이 아니라 워크플로우가 일관되게 시간을 절약한다는 것을 증명하는 것입니다.
빠르게 작동하는 베타를 얻는 것이 목표라면 Koder.ai 같은 도구를 사용해 관리 콘솔, 내보내기, OCR 작업 대시보드, 핵심 API 같은 지원 요소를 채팅 기반 명세로 빠르게 구축하는 것을 고려하세요. 소스 코드 내보내기, 배포/호스팅, 스냅샷 및 롤백을 지원하므로 파일럿 사용자와 반복하면서도 코드 소유권을 유지할 수 있습니다.
잘 설계된 앱도 예측 가능한 문제로 넘어질 수 있습니다. 미리 계획하면 몇 주의 재작업과 많은 지원 요청을 줄일 수 있습니다.
현실의 영수증은 스튜디오 사진이 아닙니다. 구겨진 용지, 바랜 잉크, 특히 감열지는 텍스트 손상을 만들 수 있습니다.
실패를 줄이려면 캡처 시 가이드(자동 자르기, 눈부심 감지, “가깝게” 프롬프트)를 제공하고 원본 이미지를 유지해 재스캔 시 모든 것을 재입력하지 않게 하세요. OCR을 “최선의 시도”로 취급하고, 추출된 필드를 신뢰도로 표시해 빠른 수정을 가능하게 하세요. 또한 신뢰도가 낮은 스캔에 대해 수동 입력 또는 고가치 영수증에 대한 사람 검토 폴백을 고려하세요.
날짜, 통화, 세금은 매우 다양합니다. “03/04/25” 같은 날짜는 상황에 따라 다르게 해석될 수 있고 VAT/GST 규칙은 합계를 저장하는 방식에 영향을 줍니다.
포맷을 하드코딩하지 마세요. 금액은 숫자와 통화 코드로, 날짜는 ISO 타임스탬프로 저장하고 감사용 원시 텍스트를 보관하세요. 세금 필드는 포함/미포함 및 다중 세금 라인을 처리할 수 있게 만드세요. 다국어로 확장할 때는 상점 이름은 원문 유지하고 UI 라벨과 카테고리 이름을 로컬라이즈하세요.
고해상도 이미지는 용량이 크고 모바일 데이터 업로드는 느릴 수 있습니다—배터리 소모와 사용자 불만을 초래합니다.
디바이스에서 압축·리사이즈하고 백그라운드 업로드 및 재시도를 구현하세요. 네트워크가 끊겨도 영수증이 “사라지지 않게” 큐를 사용하세요. 최근 영수증과 썸네일을 캐시해 빠른 탐색을 제공하고 오래된 폰에서의 크래시를 피하려면 메모리 사용에 엄격한 제한을 두세요.
변경된 총액, 중복 제출, 가짜 영수증은 실제 배포에서 빠르게 나타납니다.
중복 감지(상점/금액/날짜 유사성, OCR 텍스트 유사성, 이미지 핑거프린트)를 추가하고 의심스러운 편집(예: OCR 이후 총액 변경)을 플래그하세요. 캡처된 원본 vs 편집된 내용의 불변 감사 로그를 유지하고 정책 민감 필드에 대한 수동 재작성에는 근거를 요구하세요.
사용자는 내보내기, 삭제, 누락 영수증 복구를 요청할 것입니다.
기본 지원 툴링을 준비하세요: 사용자/영수증 ID로 검색, 처리 상태 보기, OCR 재실행, 요청 시 데이터 내보내기. OCR이 중단되거나 업로드 실패 시 대처 방안 같은 인시던트 대응 루틴과 간단한 상태 페이지(/status)를 준비하면 혼란을 관리 가능한 워크플로로 바꿀 수 있습니다.
성공적인 출시는 단순히 앱스토어에 출시하는 것이 아닙니다. 기대를 설정하고 실제 동작을 관찰하며 사용자 경험과 팀의 수정 사이의 루프를 빠르게 좁히는 과정입니다.
사용자가 가장 신경 쓰는 두 순간(영수증 처리(OCR), 기기 간 동기화)에 대한 SLA를 정의하고 UI에 표시하세요.
예: OCR이 보통 10–30초 내에 완료되지만 네트워크가 좋지 않을 때는 더 걸릴 수 있다면 이렇게 직접 알리세요: “영수증 처리 중… 보통 30초 이내”. 동기화가 지연될 수 있다면 “로컬에 저장됨 • 동기화 중” 같은 가벼운 상태와 재시도 옵션을 제공하세요. 이런 작은 신호들이 지원 티켓을 줄입니다.
초기 문제를 조기에 발견할 수 있는 소수의 지표를 추적하세요:
급증을 감지하면 알림을 설정하고 주간으로 추세를 검토하세요. OCR 신뢰도의 하향 추세는 벤더 변경, 카메라 업데이트, 또는 새로운 영수증 형식 출현을 의미할 수 있습니다.
영수증 상세 화면 근처에 인앱 피드백 버튼을 두세요. 수정은 쉽게 하고 집계된 “수정 로그”를 검토해 날짜/총액/세금/팁 같은 흔한 파싱 실수를 식별하세요. 이 목록을 우선순위로 삼아 모델이나 규칙을 업데이트하세요.
캡처와 검색이 안정화되면 고려하세요:
60초짜리 가이드를 제공하고 사용자가 편집해볼 수 있는 샘플 영수증 하나를 주며 “최적 결과 팁”(좋은 조명, 평평한 표면)을 짧게 제공하세요. 자세한 내용은 /help/receipts에 링크하세요.
먼저 좁고 검증 가능한 문제 진술부터 시작하세요(예: “몇 초 안에 영수증을 캡처하고, 자동으로 비용을 생성해 누락된 항목 없이 제출할 수 있게 한다”). 그런 다음 기본 사용자를 선택하세요(직원 또는 프리랜서)과 다음과 같은 2–4개의 측정 가능한 성공 지표를 정의합니다:
이러한 제약은 범위가 일반적인 재무 도구로 확장되는 것을 막아줍니다.
실용적인 MVP 루프는: 캡처 → 추출 → 분류 → 내보내기/제출 입니다.
v1에서 우선순위를 두어야 할 항목:
라인 아이템, 카드 피드, 고급 정책 및 깊은 통합은 루프가 안정적으로 시간을 절약할 수 있을 때까지 미루세요.
‘증빙’에서 ‘지급 가능’까지 전체 경로를 매핑하세요:
각 단계마다 자동으로 처리되어야 하는 것, 사용자가 보는 화면, 생성되는 데이터를 명시하면 환급 여정을 완성하지 않는 분리된 도구들을 만드는 일을 피할 수 있습니다.
MVP에서는 하나의 기본 시작점을 선택하세요(보통 카메라 캡처). 이후 보조 경로를 추가합니다:
선택은 UI와 백엔드 가정에 영향을 줍니다(예: 이미지 전처리 vs PDF/이메일 HTML 파싱). capture_method 필드로 소스별 정확도와 전환을 디버그하세요.
Receipt와 Expense를 분리된 연관 레코드로 설계하세요:
한 비용에 여러 영수증이 붙을 수 있고(분할 결제), 없을 수도(수동 입력) 있으므로 유연한 관계로 모델링하세요. 원시 OCR 텍스트와 정규화된 필드를 모두 보관하면 편집이 설명 가능하고 되돌릴 수 있습니다.
스캐너처럼 동작하는 카메라 경험을 제공하세요:
OCR 전에 일관된 전처리(데스크류, 원근 보정, 노이즈 제거, 대비/조명 정규화)를 수행하면 OCR 엔진을 바꾸는 것보다 정확도가 더 좋아지는 경우가 많습니다.
혼합(hybrid) 접근이 현실적입니다:
어떤 방식을 쓰든 필드별 신뢰도 점수를 저장하고(영수증 단위가 아니라) 검토 화면에서 오직 주의가 필요한 필드만 강조하세요. 업로드 트리거에 대해 투명하게 안내하고 사용자가 제어할 수 있게 하세요.
규칙 기반을 먼저 도입하고 제안 기능을 추가하세요:
또한 프로젝트, 비용 센터, 고객, 정책 태그(청구 가능/개인/정기 등) 같은 커스텀 필드를 제공해 조직의 실제 지출 방식에 맞추세요.
여러 신호를 조합하고 즉각 차단하지 마세요:
가능한 중복을 감지하면 즉시 차단하는 대신, 항목을 나란히 비교할 수 있는 ‘검토’ 화면을 제공하고 “둘 다 보관” 옵션을 두세요. 정책에 민감한 필드의 수동 재작성에는 근거를 요구하고 모든 변경을 감사 로그에 기록하세요.
신뢰성 높은 핵심 흐름을 위해 오프라인 우선 설계를 도입하세요:
사용자에게 “로컬에 저장됨 • 동기화 중” 같은 명확한 상태를 보여주고 OCR 준비 완료/거절/승인 같은 주요 이벤트에 푸시 알림을 사용하세요. 이런 점들이 불안정한 환경에서도 앱을 신뢰하게 만드는 요소입니다.