제 자동매매 봇 기록을 뒤지다 이상한 걸 봤습니다. 8일 연속으로, 매일 같은 시각에 같은 자리가 무너져 있었습니다.

그런데 그 8일 동안 저는 아무것도 못 느꼈습니다. 십여 분이면 저절로 메워졌기 때문입니다. 여러분 통장에도 아마 같은 자리가 하나쯤 있습니다.

더 이상한 건 그다음입니다. 그 자리는 제가 이미 고쳤다고 믿고 있던 자리였습니다.

월급 통장을 바꾸면서 자동이체를 옮겼는데, 옛 통장에 잔액이 남아 있어서 아직 아무 일도 안 일어난 자리. 딱 그겁니다.

한 줄을 고쳤는데 왜 매일 다시 무너질까요?

제 봇은 아침마다 시장 자료를 받아 옵니다. 새 자료가 들어오면 전에 저장해 둔 요약본은 지웁니다. 낡은 요약을 들고 판단하면 안 되니까요.

몇 달 전에 이 지우는 동작이 문제를 일으켰습니다. 지운 다음 새 요약을 만들기까지 몇 분이 비는데, 그 사이에 봇이 요약을 찾으면 빈손이 됩니다. 그래서 그 줄을 지웠습니다. 고쳤다고 적었고, 왜 지웠는지 옆에 메모까지 붙였습니다.

그런데 똑같은 줄이 네 곳에 있었습니다.

같은 명령이 네 곳에 있었다
머니노트 · 정보·교육·참고용

쉽게 말하면 이런 겁니다. 집에 수도꼭지가 네 개인데 하나만 잠그고 물을 다 잠갔다고 적어 둔 거죠.

그런데 나머지 셋에서 물이 계속 흘렀는데도 한동안 아무 소리가 안 났습니다. 저절로 메워졌기 때문입니다.

저절로 메워지는데 왜 그게 문제일까요?

남은 세 곳은 각자 자기 시간에 돌았습니다. 아침 여섯 시 사십 분에 한 번, 오후 네 시 십 분과 이십 분에 각각 한 번씩요.

그래서 하루가 이렇게 흘렀습니다.

하루가 이렇게 되풀이됐다
머니노트 · 정보·교육·참고용
표로 보기
고장은 11분 만에 저절로 메워졌습니다
시점 사건 설명
06시 40분 요약본이 지워진다 남겨 둔 세 곳 중 하나가 돈다
06시 50분 자료 없음 경고 감시 장치가 문제를 정확히 잡아낸다
06시 51분 무렵 저절로 채워진다 다른 일과가 요약을 새로 만든다
낮 시간 아무 이상 없음 사람이 볼 때는 이미 멀쩡하다

여기서 제가 놓친 게 뭐였을까요.

감시 장치는 제 할 일을 다 했습니다. 매일 정확한 시각에 “자료가 없습니다”라고 알렸어요. 문제를 못 잡은 게 아니라, 잡아서 알렸는데 제가 안 읽었습니다.

조용히 새는 물
Photo: Zulfugar Karimov / Pexels

읽지 않은 이유가 딱하게도 합리적이었습니다. 알림을 받고 확인하러 들어가면 이미 정상이거든요. 한두 번 그러면 “또 그거네” 하고 넘기게 되고, 그게 반복되면 그 알림은 눈에 들어오지도 않습니다.

숫자로 보면 이렇습니다.

기록에 남은 숫자
머니노트 · 정보·교육·참고용
표로 보기
고장은 기록에 또박또박 남아 있었습니다
항목 설명
고치지 않고 남은 곳 3 같은 명령 네 곳 중
연속으로 되풀이된 날 8 기록에 남은 실측 구간
알아차리기까지 걸린 날 18 감시 장치를 켠 뒤부터

세 숫자 중 제일 아픈 건 가운데입니다. 아무 신호가 없었던 게 아니라, 기록이 남은 그 8일 내내 경고는 매일 왔습니다.

매일 오는 경고는 왜 경고가 아닐까요?

여기서 진짜 무서운 게 시작됩니다. 매일 오는 알림은 알림이 아니라 배경음이 됩니다.

알림 배지가 쌓인 휴대폰
Photo: dumitru B / Pexels

여러분 휴대폰을 떠올려 보세요. 앱 아이콘 위에 빨간 숫자가 몇 개나 쌓여 있나요. 처음엔 하나하나 눌러서 지웠을 겁니다. 지금은요?

이 과정이 무서운 건 마지막 칸 때문입니다.

경고가 소음이 되는 순서
머니노트 · 정보·교육·참고용
표로 보기
경고는 한 번에 죽지 않습니다
단계 내용 설명
1단계 매일 같은 알림 시각도 문구도 똑같다
2단계 확인하면 정상 회복이 먼저 끝났다
3단계 또 그거겠지 화면에 떠도 안 본다
4단계 진짜를 놓친다 다른 경고까지 묻힌다

물론 자동 복구가 나쁜 것만은 아닙니다. 저 구조 덕에 봇은 그 8일 동안 큰 사고 없이 돌았습니다. 다만 덕분에 원인이 8일 동안 그대로 살아 있었죠.

오해하지 마세요. 자동 복구를 없애자는 이야기가 아닙니다. 자동으로 나은 일도 나은 걸로 치지 말고 세어 두자는 이야기입니다.

여기까지 읽으시면 이런 생각이 드실 겁니다. “그건 봇 얘기고, 내 통장은 은행이 알아서 해 주는 거 아니냐.” 저도 그렇게 생각했는데, 통장 쪽이 오히려 더 나쁩니다.

여러분 통장에도 똑같은 자리가 있습니다

이제 봇에서 통장으로 옮겨 볼게요. 닮은 데가 있습니다.

이사와 함께 흩어지는 것들
Photo: Ivan S / Pexels

월급 통장을 바꾸셨다고 해 보죠. 카드값 자동이체는 새 통장으로 옮겼습니다. 그런데 통신비, 보험료, 적금은 아직 옛 통장에 걸려 있어요. 네 곳 중 한 곳만 옮긴 겁니다.

당장은 아무 일도 안 생깁니다. 옛 통장에 잔액이 남아 있으면 거기서 그냥 빠져나갑니다.

잔액이 마르기 전까지는 조용합니다
머니노트 · 정보·교육·참고용
표로 보기
문제가 없는 게 아니라 아직 안 보이는 것입니다
단계 내용 설명
1단계 일부만 옮긴다 옮긴 것만 기억난다
2단계 잔액이 대신 낸다 명세서엔 정상
3단계 잔액이 바닥난다 여러 건이 몰린다
4단계 출금이 막힌다 처리는 기관마다 다르다

여기서 봇과 통장이 갈리는 대목이 하나 있습니다. 봇은 십여 분 뒤 저절로 복구됐지만, 통장은 잔액이 마르는 순간 대신 내 주던 것이 멈춥니다. 그리고 그때는 한 건이 아니라 여러 건이 같은 달에 몰립니다. 그다음에 무슨 일이 생기는지는 기관과 상품마다 다르니 개별 안내를 확인하셔야 합니다.

바꿔 말하면, 조용한 기간이 길수록 터질 때 크게 터진다는 뜻이죠.

다행히 이건 손으로 다 뒤지지 않아도 됩니다. 금융결제원이 운영하는 계좌정보통합관리서비스에서 내 계좌에 걸린 자동이체를 한 화면에서 조회하고 옮기거나 해지할 수 있습니다. 개인별로 이용 조건과 대상 기관이 다를 수 있으니 자세한 건 해당 서비스 안내를 직접 확인하시는 게 정확합니다.

이 구조를 이만큼 알고 있었는데도, 저는 한 달 반 뒤에 똑같은 병을 또 앓았습니다.

한 달 반 뒤, 저는 같은 병을 또 앓았습니다

부끄러운 이야기를 하나 더 해야겠네요.

봇은 증권사에서 받은 모의 계좌로 돌아갑니다. 이 계좌는 석 달마다 만기가 옵니다. 7월 초에 그 만기가 아무 말 없이 지나갔습니다. 주문이 전부 거부되기 시작했고, 여섯 건이 거부되고 나서야 알았습니다.

그때 제가 한 일은 계좌 재신청 하나였습니다. 다음 만기가 언제인지는 제 메모장에만 적어 뒀고요.

2주 뒤, 이번엔 시세 자료를 받아 오는 쪽에서 비밀번호 만료 안내가 떴습니다. 그 안내가 기록 파일 안에만 9일 동안 쌓였고, 그동안 국내 자료가 멈춰 있었습니다.

두 번의 만기, 한쪽만 고쳤다
머니노트 · 정보·교육·참고용
표로 보기
같은 병을 두 번 겪었습니다
만기가 다가올 때 계좌 만기 비밀번호 만료
알림이 있었나 없음 기록 파일에만
발견 방식 주문 6건 거부된 뒤 자료 9일 멈춘 뒤
그때 한 조치 재신청만 미리 알림 신설

비밀번호 쪽은 그날 바로 미리 알림을 만들었습니다. 만기 일주일 전과 하루 전에 알려 주는 장치였죠. 잘 만들었다고 생각했습니다.

그런데 그 장치를 계좌 만기에는 붙이지 않았습니다. 나중에 찾아보니 계좌 만기와 관련된 코드는 한 줄도 없었습니다.

제일 아픈 대목은 이겁니다. 저는 그 사실을 이미 알고 있었어요. 개발기 ④“다음 만기를 대비한 알림은 아직 안 만들었습니다. 할 일 목록에만 있습니다”라고 제 손으로 적어서 공개까지 해 놨거든요. 적어 놓는 것과 만들어 놓는 것은 완전히 다른 일이었습니다.

그럼 잘 만든 걸 복사해 붙이면 되지 않을까요?

저도 그렇게 하려고 했습니다. 비밀번호 알림이 잘 돌고 있으니 그걸 복사해서 계좌용으로 이름만 바꾸면 끝일 것 같았죠.

만기일을 미리 표시해 두는 일
Photo: Towfiqu barbhuiya / Pexels

이번엔 혼자 하지 않고 검토를 맡겼습니다. 세 군데가 걸렸습니다. 하나는 원본에서는 무해하던 것이었고, 나머지 둘은 원본에도 그대로 있던 위험이었어요.

비밀번호는 새로 바꾸면 그만이라 기록이 좀 날아가도 무해합니다. 그런데 계좌는 언제 재신청했는지가 그 기록에만 있습니다. 같은 코드가 다른 자리에서 정반대 무게를 갖는 거죠.

그중에서도 하나가 특히 위험했습니다. 원본은 알림을 보냈다고 기록할 때 실제로 보내졌는지를 확인하지 않았습니다. 전송이 실패해도 “보냄”으로 남는 구조요.

그러니까 이런 겁니다. 침묵을 막으려고 만든 장치가, 스스로 침묵을 만들고 있었습니다.

보냄 기록을 언제 남기느냐의 차이
머니노트 · 정보·교육·참고용
표로 보기
전송에 실패했을 때 다시 시도되는 미리 알림 수
항목 설명
고치기 전 보냄으로 이미 적힘 0건
고친 뒤 다음 차례에 다시 시도 3건

그래서 규칙을 하나 세웠습니다. 재발송이 침묵보다 낫다. 알림이 두 번 오는 건 성가신 일이지만, 안 오는 건 사고니까요.

검사 도중에 하마터면 기능을 죽일 뻔한 일도 있었습니다. 일주일 전 알림이 잘 나가는지 시험 삼아 실제로 보내 봤는데, 그 기록이 그대로 남으면 9월에 올 진짜 알림이 이미 보낸 걸로 처리됩니다. 시험 기록은 임시 공간에 따로 담아서 넘겼습니다. 검사가 검사 대상을 망가뜨릴 수 있다는 걸 그때 처음 겪었습니다.

그럼 이런 사고를 안 내려면 무엇부터 달라져야 할까요.

그래서 지금은 고치기 전에 셉니다

지금 계좌 만기 알림은 매일 아침 돌고 있습니다. 만기 30일·14일·7일·1일 전에 알리고, 만기가 지나면 재신청할 때까지 매일 알립니다. 이 장치가 하는 일은 알리는 것뿐이라, 스스로 주문을 내거나 계좌를 만들지는 않습니다.

만드는 과정에서 확인 항목 75개를 전부 통과시켰습니다. 그 75개 안에는 “일부러 전송을 실패시켰을 때 다음번에 다시 시도하는가” 같은, 예전 같으면 안 만들었을 항목이 들어 있습니다.

바뀐 건 코드보다 순서입니다.

지금은 이 순서로 고칩니다
머니노트 · 정보·교육·참고용
표로 보기
고치기 전에 몇 군데인지부터 셉니다
단계 내용 설명
1단계 같은 일을 다 찾는다 눈이 아니라 기계로
2단계 몇 곳인지 적는다 넷이면 넷이라고
3단계 남길 곳도 적는다 안 고침도 결정이다
4단계 한 번에 고친다 미루면 잊힌다

세 번째 칸이 핵심입니다. 안 고치기로 한 것도 결정으로 적어 두는 것. 예전의 저는 고친 것만 적었고, 그래서 나머지 셋은 애초에 존재하지 않는 것처럼 됐습니다.

오늘 남은 문장

「고쳤다」는 말에는 언제나 「어디를」이 빠져 있습니다.

제 봇에서는 그 빠진 자리가 세 곳이었고, 8일 동안 매일 무너졌고, 십여 분 만에 저절로 메워졌기 때문에 아무 일도 없는 것처럼 보였습니다.

물론 세상 모든 자동 복구를 의심하자는 건 아닙니다. 다만 저절로 나은 일에는 이유가 있고, 그 이유가 계속 유효하리란 보장은 없다는 것 정도는 세어 둘 만하더군요.

지금 여러분 통장에서 자동으로 잘 빠져나가고 있는 돈이 하나 떠오르시나요? 그게 어느 통장에서 나가는지까지 알고 계신가요. 저는 네 곳 중 한 곳만 옮겨 놓고 다 옮겼다고 믿었습니다.

이번 편은 실패담처럼 시작했지만 끝은 조금 다릅니다. 그 알림 장치는 지금 잘 돌고 있고, 다음 만기는 한 달 전부터 저한테 말을 걸어 줍니다. 메모장이 아니라 시스템이 기억하게 만든 것, 이번에 제일 잘한 일이었습니다.

다음 글 예고 — 두 번째 눈은 왜 늘 제가 안 본 곳을 볼까요

이번에 복제 위험 세 건을 잡아 준 건 제가 아니었습니다. 검토를 맡긴 쪽이었죠.

재미있는 건, 제가 세운 계획이 “어제 만든 걸 그대로 붙인다. 새로 설계하지 않는다” 한 줄이었다는 겁니다. 검토를 맡긴 쪽은 그 한 줄을 세 군데서 반려했고요.

왜 남의 눈은 늘 제가 안 본 자리를 먼저 볼까요. 다음 편에서 그 이야기를 해 보겠습니다. 개발기 ⑮에서 “내가 만든 자로 나를 재면 아는 것만 나온다”고 했던 이야기의 뒷장이기도 합니다.

그때까지 딱 하나만 해 보신다면, 오늘 통장에서 자동으로 나가는 것 중 아무거나 하나를 골라 어느 계좌에서 나가는지만 확인해 보세요. 저는 그 확인 한 번으로 세 곳을 찾았고, 찾고 나니 정리는 생각보다 금방 끝났습니다.


※ 이 글은 자동매매 시스템을 만들며 겪은 과정을 기록한 개발기입니다. 특정 종목이나 매매 방법을 권유하지 않으며, 본문의 기록은 실제 돈이 오가지 않는 모의계좌·개발 환경에서 일어난 일입니다. 자동이체·계좌 관련 절차는 금융회사와 개인의 계약 형태에 따라 달라지므로 개별 사안은 해당 기관에 확인하셔야 합니다. 투자 판단과 그 책임은 본인에게 있습니다. 정보·교육·참고용으로만 봐 주세요.