은행 현장의 언어 · 정산과 대사, 그리고 전문 · 이론
전문은 두 번 도착할 수 있다
한 줄 요약
응답이 안 오는 것과 처리가 안 된 것은 다른 사실인데 보낸 쪽은 그 둘을 구별할 수 없고, 그래서 재전송이 이중 이체를 만든다 — 막는 방법은 멱등키 하나뿐이다.
왜 이게 필요했나
은행끼리 주고받는 메시지를 전문(電文)이라고 부릅니다. 계좌이체 한 건이 전문 한 건이고, 각 전문에는 전문 번호가 붙습니다.
문제는 이겁니다. 전문을 보냈는데 응답이 오지 않았습니다. 이때 보낸 쪽이 아는 사실은 "응답을 못 받았다" 하나뿐입니다. 상대가 못 받았을 수도 있고, 받아서 처리했는데 응답이 유실됐을 수도 있습니다. 이 둘은 보낸 쪽에서 구별할 방법이 없습니다.
돈을 보내는 쪽 입장에서 재전송하지 않으면 고객 이체가 실패한 채 끝납니다. 그래서 재전송합니다. 상대가 첫 전문을 이미 처리했다면, 이제 같은 돈이 두 번 나갑니다.
어떻게 동작하나
해결책은 멱등키(idempotency key) 입니다. 원거래 하나에 하나씩 붙는 식별자입니다.
전문 번호(msg_id) 전송할 때마다 새로 매긴다. 재전송하면 다른 번호가 붙는다.멱등키(idem_key) 원거래 하나에 하나. 재전송해도 같은 값을 쓴다.받는 쪽은 멱등키를 기억해 두고, 이미 본 키가 다시 오면 처리하지 않고 첫 처리의 결과를 그대로 돌려줍니다. 실패로 답하는 것이 아니라 성공 응답을 다시 주는 것이 요점입니다. 실패로 답하면 보낸 쪽은 또 재전송합니다.
멱등키에는 만료가 있어야 합니다. 영원히 기억할 수는 없기 때문입니다. 보통 며칠에서 한 달 사이로 잡는데, 이 기간이 재전송 창보다 짧으면 멱등성이 조용히 깨집니다.
여기서 FDE 가 알아야 할 결정적인 사실이 있습니다. 이중 이체는 대사로 잡히지 않습니다.
우리가 전문을 두 번 보냈고 상대가 두 번 처리했다면, 우리 원장에도 2건이 남고 상대 정산 파일에도 2건이 들어옵니다. 건수도 금액도 정확히 일치합니다. 총계 대사는 완벽하게 통과합니다.
잡히는 자리는 하나뿐입니다. 같은 멱등키에 전문이 둘 이상 달렸는지를 보는 것입니다. 대사가 "두 장부가 같은가" 를 묻는다면, 이 조회는 "우리 장부 안에서 같은 거래가 여러 번 나갔는가" 를 묻습니다. 두 질문은 완전히 다릅니다.
현장에서 만나는 모습
첫째, "이체가 두 번 나갔어요" 문의를 대사 결과로 반박하면 안 됩니다. 대사가 맞았다는 것은 아무 근거가 되지 못합니다. 멱등키로 묶어 조회하기 전까지는 이중 이체가 없다고 말할 수 없습니다.
둘째, 타임아웃 값이 짧으면 이 사고가 늘어납니다. 상대 시스템의 처리 시간이 늘어난 날 — 마감 배치가 겹쳤다든가, 명절 직전이라든가 — 타임아웃이 대량으로 나고 재전송이 쏟아집니다. 그래서 이중 이체는 산발적으로 나지 않고 특정 날짜에 몰려서 납니다. 조사할 때 시간 분포를 먼저 보면 원인이 빨리 좁혀집니다.
셋째, 재전송을 만드는 것은 사람일 수도 있습니다. 화면에서 응답이 안 와서 담당자가 버튼을 한 번 더 누르는 경우, 배치가 실패로 판단해 다시 던지는 경우, 감시 도구가 재시도하는 경우가 전부 같은 결과를 만듭니다. 멱등키가 없으면 이 셋을 다 막아야 하는데 그건 불가능합니다.
넷째, 초과분 환입은 새 이체가 아니라 정정으로 처리합니다. 더 나간 돈을 그냥 반대 방향으로 보내면 원장에는 이체 세 건이 남고, 그중 어느 것이 원거래이고 어느 것이 정정인지 알 수 없습니다. 원장 쪽은 역분개로, 대외 쪽은 반환 전문으로 원거래 참조를 달아 보내야 나중에 추적됩니다.
다음 실습에서 할 것
우리 원장과 상대 정산 파일을 대사한 뒤, 대사가 완벽히 통과한 상태에서 멱등키로 이중 이체를 찾아냅니다. 멱등키 2개에 전문 5건이 달려 있고 초과로 나간 금액이 얼마인지를 계산합니다. 그리고 그 금액이 차액정산 포지션에 그대로 섞여 있다는 것 — 결제 전에 조정해야 한다는 것을 확인합니다.