은행 현장의 언어 · 정산과 대사, 그리고 전문 · 실습
대사와 차액정산, 그리고 대사가 못 잡는 것
목표
우리 원장과 상대 기관의 정산 파일을 대사해 편차를 건 단위까지 좁히고, 차액정산 포지션을 내고, 대사로는 원리상 잡히지 않는 이중 이체까지 찾아낼 수 있게 됩니다. 그리고 그 결과를 고객사 밖으로 나갈 수 있는 형태로 쓸 수 있게 됩니다.
왜 중요한가
대사는 은행 현장에서 FDE 가 가장 자주 하게 되는 일입니다. 그리고 가장 자주 잘못하는 일이기도 합니다.
첫 번째 함정은 대사 대상입니다. 우리 원장에는 승인만 되고 매입이 오지 않은 건이 섞여 있는데, 이건 상대 정산 파일에 없는 것이 정상입니다. 상태를 가리지 않고 대사하면 정상인 수십 건이 이상 건으로 올라오고 진짜 편차가 그 안에 묻힙니다.
두 번째는 어긋남을 읽는 방법입니다. 건수와 금액을 따로 봐야 합니다. 건수가 같고 금액만 다르면 같은 건을 서로 다른 금액으로 알고 있다는 뜻이고, 금액이 같고 건수만 다르면 한쪽이 여러 건을 묶었거나 쪼갰다는 뜻입니다. 원인이 다르므로 고객사에 올리는 창구도 다릅니다.
세 번째가 가장 중요합니다. 대사는 "두 장부가 같은가" 를 묻지 "장부가 옳은가" 를 묻지 않습니다. 타임아웃 뒤 재전송으로 같은 돈이 두 번 나갔다면, 우리 원장에도 상대 파일에도 똑같이 두 건이 남습니다. 총계 대사는 완벽히 통과합니다. 잡히는 자리는 멱등키뿐입니다.
이번 사건은 이렇습니다. 2026-08-25 정산 파일을 받았는데 총액이 맞지 않는다는 연락이 왔습니다. 기관은 세 곳이고, 그중 두 곳이 서로 다른 방식으로 어긋나 있습니다.
단계
1. /root/bank/gen_settle.py 를 만들어 실행해 /root/bank/settle.db 와 /root/bank/partner_20260825.csv 를 만드세요.
2. 정산 파일을 settle.db 에 partner 표로 적재하고, /root/bank/recon_totals.csv 에 기관별 총계를 뽑으세요. 머리글은 counterparty,our_count,our_amount,partner_count,partner_amount,count_gap,amount_gap 이고 우리 쪽은 state 가 SETTLED 인 건만 셉니다.
3. /root/bank/only_ours.csv 와 /root/bank/only_partner.csv 를 msg_id,counterparty,amount 머리글로 뽑고, /root/bank/side_counts.txt 에 only_ours=, only_partner=, naive_only_ours= 세 줄을 적으세요. 마지막 값은 state 를 가리지 않고 대사했을 때의 수입니다.
4. /root/bank/amount_mismatch.csv 에 msg_id,our_amount,partner_amount,gap 머리글로 금액이 다른 건을 뽑으세요.
5. /root/bank/dup_msg.csv 에 idem_key,msg_id,amount 머리글로 중복된 멱등키에 달린 전문을 전부 남기고, /root/bank/dup.txt 에 dup_keys=, dup_msgs=, extra_amount= 세 줄을 적으세요.
6. /root/bank/net_position.csv 에 counterparty,out_amount,in_amount,net 머리글로 기관별 차액정산 포지션을 내세요. net 은 수취에서 지급을 뺀 값입니다.
7. /root/bank/pending.txt 에 auth_count=, auth_amount=, auth_out_amount=, auth_in_amount=, stale_auth=, suspense_account= 여섯 줄을 적으세요. stale_auth 는 sent_at 이 2026-08-22 보다 이른 승인 건이고, suspense_account 는 가수금 계정과목 코드 2210 입니다.
8. /root/bank/recon_report.md 에 ## 대사 결과 요약, ## 건수는 같은데 금액이 다른 건, ## 금액은 같은데 건수가 다른 건, ## 대사로는 잡히지 않는 것, ## 차액정산 포지션, ## 개인정보 취급 여섯 절로 보고서를 쓰세요. 계좌번호는 앞 3자리와 뒤 4자리만 남겨 110-**-1234 형태로 마스킹하고, 주민등록번호와 고객 실명은 어떤 형태로도 적지 않습니다.
참고
- CSV 를 SQL 로 다루려면 표를 먼저 만들고 적재하세요:
CREATE TABLE partner(...)뒤에.import --csv --skip 1 <파일> partner. - 같은 파일을 두 번 적재하면 행이 두 배가 됩니다. 적재 전에
DROP TABLE IF EXISTS partner를 넣어 두면 몇 번을 돌려도 같습니다. - 이중 이체의 초과분은
SUM(amount * (건수 - 1))로 냅니다. 첫 전송분은 정상이므로 빼지 않습니다. - 흔한 실수 1: 3단계에서
state로 좁히지 않는 것. 편차가 2건이 아니라 18건으로 보입니다. - 흔한 실수 2: 5단계에서
msg_id로 중복을 찾는 것. 전문 번호는 재전송마다 새로 매기므로 아무것도 안 나옵니다. - 흔한 실수 3: 8단계에서 조사 화면에 보였다는 이유로 계좌번호를 그대로 옮기는 것. 보고서에 필요하지 않은 개인정보를 남기는 것 자체가 사고입니다.
단계 8개
- 우리 원장과 상대 정산 파일 만들기
- 정산 파일 적재하고 기관별 총계 맞추기
- 한쪽에만 있는 건 가려내기
- 금액이 다른 건 찾기
- 멱등키로 이중 이체 찾기
- 차액정산 포지션 내기
- 미결제와 가수금 잔고 세기
- 마스킹한 대사 보고서 쓰기