간단한 가계부 앱 만들기 (Streamlit + Postgresql)

매번 카드 결제 문자를 엑셀에 옮겨 적는 것은 귀찮은 일이다. Gemini3 를 가지고, 문자를 복사해서 붙여넣기만 하면 자동으로 날짜, 금액, 가맹점을 분류해주고 저장까지 해주는 ‘나만의 로컬 가계부’를 만들기로 했다. 복잡한 프론트엔드 지식 없이 파이썬만으로 빠르게 구현 가능한 Streamlit을 선택했다.

기술 스택 및 구조

개인이 사용할 로컬 도구이므로 ‘빠른 개발’‘심플한 아키텍쳐’ 에 초점을 맞췄다.

  • Frontend & Backend: Python Streamlit (웹 인터페이스 및 로직 통합)
  • Database: PostgreSQL (Docker 컨테이너로 구동)
  • Data Processing: Pandas, Regular Expression
  • Deployment: Localhost (MacBook)

필요한 파이썬 라이브러리 설치한다.

pip install streamlit psycopg2-binary pandas sqlalchemy

정규표현식(Regex) 파싱

카드사마다 문자의 형식이 다르다. 이를 정형 데이터로 변환하기 위해 정규표현식을 사용했다. 가장 중요한 금액, 날짜, 시간, 가맹점명을 추출하는 패턴을 정의했다. 단순 텍스트가 데이터프레임(DataFrame)으로 변환되는 가장 중요한 단계다.

pattern = r"([\d,]+)원.*?\s+(\d{2}/\d{2})\s+(\d{2}:\d{2})\s+([^\n]+)"

데이터베이스 연결: Docker와 PostgreSQL

로컬 PC에 DB를 직접 설치하여 환경을 더럽히는 대신, Docker를 활용했다. psycopg2 드라이버를 통해 파이썬 앱과 DB를 연결했다. 데이터 조회는 SQLAlchemyPandas를 연동하여 SQL 결과를 즉시 데이터프레임으로 시각화할 수 있도록 구성했다.

간만에 postgresql 을 사용하다보니, psql 내 명령어 몇개만 정리한다. psql 로 접속.

$ psql

데이터베이스 선택(\c, Connect) : 접속 후, 우리가 만든 mydb 데이터베이스로 이동한다. (Connect)

postgres=# \c mydb
You are now connected to database "mydb" as user "postgres".

테이블 목록 조회 (\dt, Display Tables) : 현재 데이터베이스에 생성된 테이블 리스트를 보여준다.

mydb=# \dt
             List of relations
 Schema |     Name      | Type  |  Owner
--------+---------------+-------+----------
 public | employees     | table | postgres
 public | expenses      | table | postgres
 public | foo           | table | postgres

테이블 구조 확인 (\d, Describe) : 특정 테이블의 컬럼명, 데이터 타입 등 상세 스키마를 확인한다.

mydb=# \d expenses;
                                        Table "public.expenses"
   Column   |            Type             | Collation | Nullable |               Default
------------+-----------------------------+-----------+----------+--------------------------------------
 id         | integer                     |           | not null | nextval('expenses_id_seq'::regclass)
 date       | date                        |           |          |
 time       | time without time zone      |           |          |
 merchant   | character varying(100)      |           |          |
 amount     | integer                     |           |          |
 category   | character varying(50)       |           |          |
 raw_text   | text                        |           |          |
 created_at | timestamp without time zone |           |          | CURRENT_TIMESTAMP
Indexes:
    "expenses_pkey" PRIMARY KEY, btree (id)

UI 디자인: Streamlit의 한계 넘기

Streamlit의 기본 디자인은 데이터 분석 도구처럼 투박하다. 이를 최신 핀테크 앱(토스, 뱅크샐러드) 같은 느낌으로 바꾸기 위해 두 가지 전략을 사용했다.

  • Custom CSS 주입: st.markdown을 통해 CSS를 강제로 주입하여 폰트, 배경색(#F2F4F6), 버튼 스타일을 변경했다.

  • Card Layout: st.container(border=True)와 CSS 그림자 효과를 결합하여 입체감 있는 ‘카드형 UI’를 구현했다.

이로써 “파이썬으로 만든 툴” 같지 않은, 심플하고 모던한 UI를 완성했다.

결과 및 향후 계획

단 1~2시간 만에 입력부터 DB 저장, 조회까지 가능한 ‘나만의 가계부’가 완성됐다. AI 와 함께라면 이런 구조의 웹서비스도 맘만 먹으면 하루도 안되서 구축할 수 있는 세상이 왔다. 현재는 키워드 기반으로 카테고리를 분류하지만(예: ‘스타벅스’ -> ‘식비’), 추후에는 누적된 데이터를 바탕으로 딥러닝 모델 을 적용하여 자동 분류 정확도를 높여 볼 생각이다.


더 보면 좋을 글들