데이터베이스나 통신 관련 프로토콜을 구현해본 사람은 2단계 커밋이라는 용어를 많이 들어봤을 테다. 트랜잭션이 원자적으로 진행되도록 만들어주는 이 훌륭한 개념 때문에 ATM에서 돈을 찾고 인터넷으로 물건을 안심하고 구매할 수 있다. 하지만 2단계 커밋이 만능일까? 글쎄?
경우에 따라서는 2단계 커밋을 고의(?)로 사용하지 않는 경우가 있다. IEEE Computger에 실린 커피점은 2단계 커밋을 사용하지 않는다(PDF 파일)와 같은 글을 읽어보면 종업원당 작업 처리량을 늘이기 위해 일부러 2단계 커밋을 사용하지 않고 있음을 알려준다. 스타벅스 커피 숍에서는 고객이 주문한 다음에 이름(미국)을 부르거나 주문한 내용(일본, 한국)을 부르면 그 때서야 자신이 마실 커피를 받으러 간다. 그 사이에 어떤 오류가 발생하거나 문제(예: 잘못된 커피가 나오거나 양이 잘못될 경우)가 터지더라도 이 정도 손실은 무시하는 편이 유리하다.
커피 전문점이야 그렇다 치자. 커피 한 잔에 얼마한다고... 정 안되면 새로 한 컵 뽑아서 손님에게 서비스 하면 그만이다. 하지만 은행 송금 과정에서 2단계 커밋을 사용하지 않는 경우가 있을까?
우리가 인터넷으로 송금을 할 때는 다음과 같은 절차를 밟는다.
- 인출 금액, 상대편 계좌 번호, 비밀 번호를 넣는다.
- 상대편 은행에 질의를 던져서 계좌 번호에 맞는 사람 이름을 출력한다. 만일 계좌 번호가 존재하지 않거나 입금 시킬 수 없는 특수한 계좌 번호일 경우 오류를 반환한다.
- 이 계좌 번호와 사람 이름이 맞을 경우 송금을 지시한다.
당연하다고? 그렇다면 해외 송금은 어떨까? 외국 은행으로 송금을 할 경우에는 유감스럽지만 상기 시나리오가 통하지 않는다. 우선 온라인으로 연결은 되어있지만 계좌 정보를 교환하는 시스템은 갖춰져 있지 않다. IMF가 이런 표준을 만들려고 할까? 어림도 없는 이야기다. 송금 요청을 하면 은행에서는 송금 전문을 상대편 은행으로 날리고 종료해버린다. 내가 보낸 사실은 알지만 상대편이 제대로 받았는지는 알아낼 방법이 없다. 송금한 은행 쪽에서는 '처리 완료'라는 상태만 알 수 있다. 나머지는 (시차 때문에) 상대편 은행에서 비동기적으로 처리한다.
계좌번호나 수취인 정보를 제대로 입력했다면 특별한 문제가 발생하지 않고 돈이 제대로 송금될 것이지만... 만일 뭔가 실수를 했다면? 2단계 커밋을 사용하지 않기 때문에 사후 대응이 필요하다. 자, 여러분이 수취인 정보를 햇갈려서 다른 사람 이름으로 잘못 입력했다고 가정하자. 유럽으로 돈을 보낸다고 가정할 때 상대편 은행은 일단 유럽향 송금 과정에서 사용하는 은행명+계좌번호를 통합한 표준인 IBAN 코드가 일치하므로 입금은 시켜준다. 그런데 나중에 수작업으로 검토하는 과정에서 수취인 정보가 잘못되었음을 깨닫고 은행 직권으로 입금을 취소시켜버린다. 이 돈을 다시 여러분 통장으로 약간 지연된 동기적(?)인 방식으로 반환하는 방법이 정상인 듯이 보이지만, 유감스럽지만 그렇게 하지 않는다.
- 만일 은행에서 원래 보낸 국가의 예금주로 송금을 한다면 수수료는 누가 물지?
- 환율 변화에 따른 손실은 어떻게 하지?
따라서, 이런 두가지 문제점을 해결하기 위해 송금받은 은행은 실패한 트랜잭션을 보류하고 돈을 쥔채로 무작정 기다리고 있다. 따라서 송금한 사람이 나중에 돈이 가지 않았다는 사실을 파악한 다음 자신의 실수를 깨닫고 이를 바로잡아야 한다. 어떤 방법으로? 바로 변경(Amend) 신청이다. 송금을 하게 되면 송금 고유 번호(FOT)가 붙는다. 은행마다 인터페이스는 조금씩 다르지만 이 번호를 사용해서 자신이 보낸 송금 정보를 변경할 수 있다. 창구나 인터넷으로 접속해서 변경 신청을 하면 소정의 수수료를 받고서 상대편 은행으로 FOT 변경을 해준다. 그러면 상대편 은행은 이 변경 신청 요청을 보고 유효할 경우 중단된 트랜잭션을 재개한다.
부지불식간에 국내 송금 과정에서 2단계 커밋에 익숙해져 있는 분들은 상기 시나리오가 무척 머리 아프고 직관적이지 못하다는 생각이 들지도 모르겠다. 하지만 이런 과정을 작업 처리량을 늘이기 위해 2단계 커밋을 포기하고 비동기적으로 움직이는 커피 전문점에 빗대어 이해하면 어떨까? 해외 송금할 때 조금 덜 불안하지 않을까? :)
뱀다리) 아마 당분간 구글로 해외 송금을 입력하면 이 글이 가장 먼저 올라올 거다. 해외 송금 과정에서 정보 입력을 잘못해서 순간 당황하신 분들에게 조금이라도 도움이 되었으면 좋겠다.
EOB
해외 송금을 장기적인 관점에서 바라봐서 2단계 커밋이라고 볼 수도 있지만... 단기적인 관점에서는 돈이 공중으로 떠버리는(송금이 _완료_되었음에도 불구하고 송금인 계좌에도 돈이 없고 수취인 계좌에도 돈이 없는) 현상이 발생하므로 2단계 커밋이 아니라고 말했습니다. 혹시 데이터베이스 이론에 능숙한 분께서 읽으신 다음에 이 무슨 말도 안되는 이야기냐고 고개를 갸우뚱할지 몰라서 노파심에서 코멘트 남겨봅니다.
답글삭제잘 읽었습니다.
답글삭제예~ 즐겁게 읽으셨다니 감사합니다. ;)
답글삭제제 동생이 미국에 살아서 몇차례 송금한 적이 있습니다. 이름과 은행 계좌번호만 알면 송금하는데 지장이 없는 국내와는 달리, 라우팅번호가 더 필요하더군요. 말씀하신 것처럼 바로 확인도 안되고요. 그리고 수수료도 만만치 않았습니다, 소액이라면 paypal등을 이용하는게 가장 좋을듯 싶었더군요.
답글삭제미리 이 글을 올리셨다면 이같은 경우로 수수료를 두 번 물지 않아도 될을텐데...아깝습니다. 내 수수료...^^
답글삭제앞으로도 일상 생활에 도움이 될만한 재미있는 사례를 많이 올려드리겠습니다. ;)
답글삭제