시장을 지켜보라고 켜 둔 감시 하나가, 27일 중 23일을 쉬고 있었습니다.
그런데 고장이 아니었습니다. 서버가 죽은 것도, 코드에 오류가 난 것도 아니에요.
설정 한 줄이 그렇게 하라고 시킨 겁니다. 늦게 깨어났다는 이유로요. 1초.
그 감시에는 “정해진 시각보다 1초 넘게 늦으면 이번 회차는 없던 일로 한다”는 설정이 붙어 있었습니다. 봇 전체에서 그 설정을 달고 있는 일감이 26개였고요.
더 아픈 건 이겁니다. 서버 기록에는 27일 내내 “건너뛰었다”고 찍혀 있었습니다. 아무도 그 줄을 읽지 않았을 뿐이에요.
걸어 두고 잊은 자동이체나 알림이 있으시다면, 이 글은 봇 이야기가 아니라 그것들 이야기이기도 합니다.

개발기⑨에서 안전장치 네 개가 한꺼번에 헛돌았다는 이야기를 했습니다. 그때는 달아 놓은 장치가 제 역할을 못 한 이야기였죠. 오늘은 한 칸 더 앞입니다. 장치가 아예 실행되지 않은 이야기니까요.
25개를 만들어 놓고, 한 번도 성적표를 안 봤습니다
이걸 파게 된 출발점은 7월 26일이었습니다. 그동안 만들어 둔 관찰 장치를 처음으로 전부 열어 봤거든요.
관찰 장치가 뭐냐면, 매매에 바로 쓰지 않고 “이 방법이 맞는지 옆에서 조용히 재기만 하는” 장치입니다. 새 아이디어가 떠오르면 바로 돈을 걸지 않고 이걸 먼저 붙여요.
그런 장치가 25개 있었습니다. 그리고 25개 전부에 똑같은 문장이 적혀 있었어요. “표본 30개가 쌓이면 사람이 판단한다.”
쌓였는지 확인한 적이 한 번도 없었습니다.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 이미 판단 가능 | 표본이 다 쌓였는데 아무도 안 봄 | 7개 |
| 그중 효과 없음 확정 | 그런데 계속 돌고 있었음 | 4개 |
| 속이 텅 빈 채 실행 | 매일 도는데 들어오는 게 0 | 4개 |
일곱 개는 이미 판단할 재료가 다 쌓여 있었습니다. 그리고 그 일곱 중 네 개는 “효과 없다”가 이미 확정됐는데도 매일 계속 돌고 있었고요.
이것들과 별개로 네 개는 매일 도는데 안에 아무것도 안 들어오고 있었습니다.
여기서 나온 문장이 이겁니다.
만드는 절차는 있는데, 채점하고 닫는 절차가 없었습니다.

“안 도는 것”과 “돌 대상이 없는 것”은 다릅니다
속이 빈 장치들을 하나씩 열어 보다가, 처음엔 완전히 틀린 결론을 냈습니다.
악재를 맞은 종목을 걸러 내는 장치가 하나 있었는데, 배포하고 나서 결과 파일이 한 번도 안 생겼거든요. 그래서 “이건 아예 안 돌고 있구나”라고 적었습니다.
틀렸습니다. 매일 돌았고, 설계한 그대로 정확히 작동하고 있었어요.
들어오는 재료가 문제였습니다. 이 장치는 “몇 번 종목”이라는 종목 번호가 있어야 판정을 합니다. 그런데 실제로 들어온 건 대부분 “성장주”, “반도체” 같은 업종 이름뿐이었어요.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 종목 번호 없이 업종 이름만 | 이 장치가 판정할 수 없는 형태 | 244 |
| 종목 번호 있음 | 판정 가능 | 123 |
367건 중 244건, 그러니까 3분의 2가 종목 번호 없이 들어왔습니다. 최근 6일치 악재 목록 50건만 따로 세어 보니 국내 종목 번호는 0개였습니다.
쉽게 말하면 이렇습니다. 우편함은 매일 정확히 열어 봤는데, 편지가 주소 없이 오고 있었던 겁니다. 우편함 잘못이 아니죠.
그래서 규칙을 하나 새로 적었습니다. “안 도는 것”과 “돌 대상이 없는 것”을 먼저 가를 것. 둘은 화면에서 똑같이 0으로 보이거든요.
그런데 8월 3일, 훨씬 큰 게 나왔습니다
여기까지는 “빈 장치를 찾았다”는 이야기였습니다. 그러다 봇의 알람 시계 쪽을 열어 봤어요.
봇에는 정해진 시각에 정해진 일을 시키는 장치가 있습니다. 새벽 2시엔 하루 정리, 오후 4시엔 살펴볼 종목 목록 갱신, 이런 식으로요. 지금 세어 보면 180개가 걸려 있습니다.
그중 26개에 “1초 넘게 늦으면 이번 회차는 건너뛴다”가 붙어 있었습니다.

표로 보기
| 항목 | 값 | 설명 |
|---|---|---|
| 봇에 걸린 정기 일감 전체 | 180개 | 8월 4일 서버 기준 |
| 그중 유예 1초짜리 | 26개 | 늦으면 회차를 통째로 버림 |
| 허용되는 지각의 한계 | 1초 | 컴퓨터에겐 아슬아슬한 시간 |
컴퓨터가 정확히 그 시각에 깨어나는 건 생각보다 드문 일입니다. 다른 일을 하다 보면 1초, 2초쯤은 그냥 밀려요. 그리고 그때마다 하루치가 통째로 사라졌습니다.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 미국 장 마감 감시 | 새벽 4시 · 시장 상태 점검 | 85% |
| 종목 목록 갱신 | 오후 4시 · 국내와 미국 명단 | 89% |
| 하루 정리 작업 | 새벽 2시 · 기록 요약 | 67% |
국내와 미국 종목 목록을 갱신하는 일감은 89퍼센트를 건너뛰었습니다. 고치기 전 27일 동안 실행된 기록은 40회가 넘는데, 그중 예정된 시각인 오후 4시 정각에 돈 건 세 번뿐이었어요.
나머지는 언제 돌았을까요.
서버를 다시 켤 때마다 돌고 있었습니다. 그러니까 명단 갱신이 사실상 “재부팅할 때만” 일어나고 있었던 거예요.
여러분 집으로 치면 이런 겁니다. 매일 아침 7시에 울리기로 한 알람이 대부분 안 울리고, 이사하거나 정전됐다 복구될 때만 울린 셈입니다.
기록엔 27일 내내 적혀 있었습니다
여기가 제일 부끄러운 대목입니다.
건너뛸 때마다 서버는 기록을 남깁니다. 실제로 이렇게 적혀 있었어요.
“이 일감의 실행 시각을 놓쳤습니다 — 1.309초 늦음”
기록이 남아 있는 한 달 동안 120번. 일곱 종류의 일감에서 나왔습니다.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 1초 늦음 | 가장 흔한 경우 | 98건 |
| 2초 늦음 | 두 번째로 흔함 | 16건 |
| 3초 늦음 | 드묾 | 2건 |
| 4초 늦음 | 드묾 | 1건 |
| 5초 늦음 | 관측된 최대 | 3건 |
1초만 늦은 게 98번입니다. 조금만 더 기다렸으면 살아났을 일들이에요.

그런데 매일 도는 자동 점검은 이걸 못 잡았습니다. 그 점검은 “에러가 몇 건인가”와 “결과 파일이 오래되지 않았나”를 보는데, 건너뛴 기록은 에러보다 한 단계 낮은 “경고”로 찍히거든요.

표로 보기
| 점검 항목 | 자동 점검이 본 것 | 실제로 벌어진 일 |
|---|---|---|
| 에러 건수 | 0건 · 점검 기준 정상 | 경고로 찍혀서 안 세어짐 |
| 결과 파일 신선도 | 파일 있음 · 정상 | 정각이 아니라 재시작 때 만들어짐 |
| 미발화 감시 장치 | 항목 자체가 없음 | 27일 내내 매일 발생 |
개발기⑩에서 “숫자 옆에 비교 대상을 안 놓아서 착시가 생겼다”는 이야기를 했는데요. 이번엔 결이 다릅니다. 숫자가 아예 화면에 없었습니다.
바꿔 말하면 이런 겁니다. 앞의 것은 잘못 읽은 문제였고, 이건 읽을 자리를 안 만든 문제였어요.

알림을 붙이려다, 알림이 같은 병을 만들 뻔했습니다
고치는 방법은 뻔해 보였습니다. 건너뛰면 휴대폰으로 알려 주게 하면 되니까요.
그렇게 짠 설계를 적대적으로 물어뜯으라고 붙여 둔 AI에게 넘겼습니다. 그리고 “이대로 배포하면 안 된다”는 답이 왔어요.
이유를 듣고 나니 소름이 돋았습니다.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 일감이 건너뛰어짐 | 알림을 보내야 함 |
| 2단계 | 그 자리에서 전송 | 최대 10초 대기 |
| 3단계 | 일하는 담당 10명이 묶임 | 동시에 오면 전원 대기 |
| 4단계 | 다음 일감도 건너뛰어짐 | 처리할 담당이 없어서 |
봇에서 일을 처리하는 담당은 10명입니다. 알림을 그 자리에서 보내면 메시지 하나당 최대 10초를 붙잡혀요. 건너뛴 일감이 한꺼번에 여러 개 생기면 10명이 전부 알림을 보내느라 묶이고, 그 사이 다음 일감이 또 건너뛰게 됩니다.
병을 고치려고 만든 장치가 그 병을 다시 만들어 내는 구조였습니다.
해법은 이렇게 바꿨습니다. 건너뛴 순간에는 쪽지만 상자에 넣고(눈 깜짝할 새에 끝납니다), 그 쪽지를 꺼내 보내는 일은 따로 둔 담당 한 명이 맡습니다. 상자가 꽉 차면 버리되 몇 장을 버렸는지 세어 둡니다.
물론 “그냥 유예 시간을 넉넉히 주면 되지 않나” 하실 수 있습니다. 실제로 그렇게 했어요. 다만 시장 상태를 보는 감시 셋에는 300초를 넘기지 못하게 막았습니다. 이 감시들은 실행되는 그 순간의 시장을 사진 찍는 방식이라, 늦게 돌면 늦은 시각의 시장을 찍거든요. 30분을 줬다면 오후 3시 감시가 장이 닫히는 시각에야 돌게 됩니다.
고친 날 오후 4시, 11초 늦었는데도 실행됐습니다
8월 3일에 고쳐서 올렸습니다. 그리고 그날 바로 확인됐어요.

표로 보기
| 시점 | 사건 | 설명 |
|---|---|---|
| 낮 12시 31분 | 고친 설정 배포 | 이 일감의 유예를 1초에서 300초로 |
| 16시 00분 11초 | 종목 목록 갱신 실행 | 11초 지각 · 옛 설정이면 버려졌음 |
| 16시 10분 00초 | 다음 작업이 그 명단을 사용 | 끊겨 있던 연결이 이어짐 |
| 그날 밤부터 이튿날 낮 | 건너뜀 기록 | 0건 · 관측은 아직 하루치 |
고치기 전 한 달 동안 일곱 종류에서 120번 나오던 건너뜀 기록이, 배포 뒤 하루 동안은 0건입니다.
물론 하루치 관측으로 “해결됐다”고 말할 수는 없습니다. 건너뜀이 없다 보니 새로 붙인 알림이 실제로 도착하는지는 아직 못 봤어요. 알림을 만들어 놓고 울려 본 적이 없는 셈이니, 이 편의 교훈이 그대로 다음 숙제로 남았습니다.
그래도 하나는 분명합니다. 이건 큰 기능을 새로 만든 게 아니라 숫자 몇 개를 바꾼 것인데, 27일 동안 사라지던 하루치가 돌아왔거든요.
그리고 그 기록이 우리를 한 번 더 때렸습니다
위 연표를 다시 보시면 실행 시각이 16시 00분 11초입니다.
11초 늦었어요.
이게 왜 문제냐면, 우리가 이번 수리의 근거로 쓴 문장이 이거였거든요. “지금까지 관측된 지각은 1초에서 5초 사이다.” 실제로 120건을 다 세어서 나온 값이었습니다.
그런데 배포 당일에 11초가 나왔습니다.

표로 보기
| 항목 | 값 | 설명 |
|---|---|---|
| 우리가 관측한 최대 지각 | 5초 | 표본 120건에서 나온 값 |
| 배포 당일 실제 지각 | 11초 | 관측 최대의 두 배 이상 |
| 이 일감에 새로 준 유예 | 300초 | 결론이 안 바뀐 건 운이 좋아서 |
다행히 이 일감에 새로 준 유예가 300초라 11초는 아무 문제가 안 됐습니다. 오히려 옛 설정이었다면 그날도 버려졌을 테니, 수리의 정당성은 더 강해졌습니다.
그런데 다행이었을 뿐입니다. 만약 유예 시간을 10초쯤으로 잡았다면, “행동 변화 없음”이라는 판정은 그날 바로 거짓이 됐을 거예요.
여기서 규칙을 하나 더 적었습니다.
관측 표본으로 상한을 말하지 마라. 우리가 본 최대치는 “여기를 넘지 않는다”는 증거가 아니라, “아직 못 본 값의 아래쪽”일 뿐이니까요.
그래서 배운 것
오해하지 마세요. 이번에 드러난 건 정해진 시각에 도는 일감들이고, 그중 진입 후보를 거르는 일감은 건너뛴 기록이 0건이었습니다.
그렇다고 “나머지는 다 정상”이라는 뜻은 아닙니다. 제가 확인한 건 그 한 건이 0이었다는 것뿐이거든요. 이 편의 교훈이 정확히 그거라서, 여기서 안심을 넓히면 같은 실수를 반복하는 셈입니다.
그래도 무게가 가볍진 않습니다. 시장 상태를 살피는 감시가 대부분의 날에 안 돌았다면, 그 판단이 낡은 사진을 보고 내려졌다는 뜻이거든요.
세 문장으로 남깁니다.
켜 두는 것과 도는 것은 다릅니다. 설정 파일에 이름이 적혀 있는 것과, 오늘 실제로 실행된 것은 별개입니다.
기록이 없다는 건 안 일어났다는 뜻이 아닙니다. 반대로 기록이 있다는 것도 읽고 있다는 뜻이 아니고요. 우리 서버는 27일 내내 정직하게 적어 두고 있었습니다.
초록불이 가장 위험합니다. 점검 항목에 없는 일은 영원히 초록으로 보이니까요.
자동이체나 보험 특약처럼 걸어 두고 잊은 것 중에, 여러분이 마지막으로 명세서를 열어 실제 실행을 눈으로 확인한 게 언제인가요? 저는 스물다섯 개를 걸어 두고 한 번도 성적표를 안 봤습니다.
다음 글 예고 — 감지는 살아 있는데 수리가 죽었습니다
이 이야기에는 뒷장이 있습니다.
8월 4일 새벽, 문제를 찾는 쪽은 정상적으로 돌아서 고칠 목록까지 만들어 놨는데, 그걸 받아서 고치는 쪽이 30분을 매달리다 강제 종료됐거든요. 그날 산출물이 통째로 사라졌고, 화면에도 알림에도 아무것도 뜨지 않았습니다.
다음 편을 준비하고 있습니다 ✍️
이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발·운영 과정을 공유하는 정보·교육·참고용 글입니다. 본문의 기록은 실제 돈이 오가지 않는 모의계좌 환경에서 일어난 일이며, 미래 성과를 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.
근거: 지시문 1113 — 스케줄러 미발화 경보 · 지시문 1113-R — 유예 시간 값 정정 · 지시문 1116 — 감지는 살아 있는데 수리가 죽었다 · 지시문 1101 — 관찰 장치 25개 전수 채점 · 지시문 1087 — 입력 형식 불일치로 영원히 0건 · 관측 표본으로 상한을 말하지 마라 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.
아직 댓글이 없습니다. 이 글을 읽고 떠오른 생각을 남겨 주세요.