폰 결제 알림을 노션 가계부로 자동 기록하기 (2) — 알림 텍스트 파싱의 지옥

카드·은행·페이 알림에는 표준이 없다. 카카오페이 방향, 신한 입금 금액 누락, 토스 대출 독촉 오분류, 자기이체, 해외결제까지 — 실제로 겪은 파싱 삽질과 교훈.

📌 card2notion 시리즈 (2/3) — 알림 텍스트 파싱의 지옥. 1편(전체 구조)에서 이어진다.

알림 텍스트에는 표준이 없다

1편에서 구조는 단순하다고 했다. 문제는 알림 텍스트를 숫자와 의미로 바꾸는 파싱이었다. 실제로 겪은 것들을 적어둔다. 전부 한 번씩 노션에 잘못 찍혔던 것들이다.

아래는 내가 주로 사용하는 체크카드 결제, 친구랑 N빵 알림 예시이다.

image.png

image.png


카카오페이: “보냈어요”가 입금이라고?

카카오페이 정산 알림은 상대방 입장에서 문구가 온다.

  • “OOO님이 2,000원을 보냈어요” → 상대가 나한테 보낸 것 = 내 입금
  • “OOO님에게 보냈어요” → 내가 보낸 것 = 출금

처음엔 순진하게 “보냈어요 = 출금”으로 짰다가, 정산으로 받은 돈이 전부 출금으로 찍혔다. 방향을 뒤집어 해결.

함정이 하나 더. 카카오페이는 카카오톡과 한 앱이라 “사진 보냈어요” 같은 일상 대화도 같이 들어온다. 그래서 금액이 바로 앞에 붙어 있을 때만 거래로 인정한다.

def is_kakaopay_received(text):   # "보냈어요" = 친구가 보냄 = 내가 받음
    return re.search(r"[\d,]+\s*.{0,4}보냈어요", text) is not None

def is_kakaopay_sent(text):       # "받았어요" = 친구가 받음 = 내가 보냄
    return re.search(r"[\d,]+\s*.{0,4}받았어요", text) is not None

앞에 [\d,]+\s*원이 붙어 있어야만 매칭 — “사진 보냈어요”는 걸러진다.

💡 추측하지 말고 실제 알림을 다 모아 보고 짜라. 이 프로젝트의 버그는 대부분 “형식을 상상해서 짠” 데서 나왔다.


신한 입금: 금액이 안 잡힘

같은 입금인데 알림이 두 종류로 왔다. 하나는 금액이 찍힌 상세 알림, 하나는 금액 없는 요약 알림. 요약 알림이 먼저 잡히면 금액 칸이 비어버렸다. → 금액이 들어 있는 알림만 채택하도록 폰(Tasker) 쪽에서도 가드를 걸고, 서버에서도 금액 정규식을 보강했다.

토스 대출 “독촉”이 부채상환으로

토스가 “이자 채워주세요” 같은 안내성 알림을 보내는데, “대출”·“상환” 단어가 들어가 실제 부채상환 거래로 오기록됐다. 부채상환 판정은 출금/자동이체 + 대출 관련 단어일 때만 하게 좁혔다.

_LOAN_WORDS = ("대출", "원리금", "원금", "상환", "갚음", "갚았", "이자")

def is_loan_withdrawal(text):
    outflow = ("출금" in text) or ("자동이체" in text)
    return outflow and any(w in text for w in _LOAN_WORDS)

그리고 “채워주세요”·“갚아야” 같은 독촉/안내 문구는 아예 앞단(1편의 필터)에서 리마인더로 걸러낸다.

자기 계좌 이체가 수입으로

내 계좌 A에서 내 계좌 B로 옮긴 건 수입도 지출도 아니다. 그런데 수입으로 잡혔다. → 입금자명이 내 이름과 일치하면(알림에 일부 마스킹된 형태로 와도 매칭되게) 이체로 분류해 통계에서 완전히 제외했다.

해외 결제(외화)

원화가 아니라 외화로 오면 환율을 마음대로 환산하기 싫었다. → 추정하지 않고 금액을 비워 “검수 필요”로 표시하고, 원화 금액은 카드 전표의 원화 결제 금액 확인 후 손으로 넣는다.

def has_foreign_currency(text):
    return re.search(r"\(USD\)|\bUSD\b|\$\s*\d|해외승인", text) is not None
# → 원화가 없으면 amount는 비우고 review=True (추정 금지, 검수필요)

원화와 외화가 같이 오면 원화 금액만 읽는다.

앱마다 다르게 처리

알림에 앱 패키지명(APP:<패키지>)을 함께 실어 보내서, 어느 앱에서 온 알림인지로 1차 라우팅한다. 자동이체·대출 관련은 부채상환 쪽으로, 페이는 페이 파서로 흘려보낸다.


배운 것

  • 실제 데이터부터 모아라. 형식을 상상해서 짜면 거의 100% 틀린다.
  • 로그(journal)가 생명줄. 놓치거나 틀린 알림의 원문이 남아 있어서, 매번 원문으로 “왜 틀렸는지”를 역추적했다.
  • 파서는 완성이 없다. 새 카드·새 은행 알림이 오면 또 깨진다. 그래서 케이스가 나올 때마다 테스트로 박제해뒀다(지금 42개).

다음 편

파싱해서 노션에 넣는 것까지 됐으면, 이제 보는 재미다. 3편은 노션 자체를 대시보드로 만든 이야기 — 월간 요약, 노션에서 관리하는 분류 규칙, 동적 기간 통계.

➡️ 3편 — 노션을 대시보드로에서 계속.

댓글

익명 댓글입니다. 닉네임과 내용이 저장되며, 서로 존중하는 표현을 부탁드려요. 부적절하거나 광고성 댓글은 예고 없이 삭제될 수 있습니다.