DEV Community

finaltype
finaltype

Posted on Originally published at finaltype.github.io

[260713~260719] 첫 실주문 앞에서, 믿을 수 없는 것부터 다 끄집어냈다

WiFi가 15초 끊긴 사고가 견고함의 원칙을 세우게 했고, 실제 돈이 나가는 코드를 감사하자 "아직 첫 주문을 넣지 말라"는 결론이 나왔습니다

이번 주는 실거래 범위를 실제로 넓히기 직전의 한 주였습니다. 그래서 "새로 뭘 만들까"보다 "지금 있는 걸 얼마나 믿어도 되나"가 계속 앞에 놓였습니다.

월요일부터 토요일까지, 데이터든 AI든 네트워크든 실주문 코드든 — 믿고 넘어가려던 것마다 한 번씩 뒤집혔습니다. 그리고 그 의심들이 이번 주의 순서를 정했습니다.

시작은 데이터였다 — 그리고 "고치는 대신 다시 안 생기게"로 옮겨갔다

주 초의 발견들은 전부 "겉보기엔 멀쩡한데 조용히 틀린" 것들이었습니다.

리포트를 검토하던 AI가 어떤 종목의 실적을 "이런 수치는 역대 없었다"며 자신 있게 데이터 오염이라고 판정했는데, 확인해보니 진짜였습니다. AI가 근거로 삼은 "역대 없었다"가 사실은 그 모델의 학습이 끝난 시점까지의 세상 지식일 뿐이었던 겁니다.

같은 날, 재무 숫자는 맞는 회사 걸 가져오면서 이름표만 다른 회사로 붙던 버그도 잡았습니다.

화요일엔 더 아찔한 걸 발견했습니다. 가장 자주 언급되는 대형주 두 곳의 이름이, 이름 인식 로직의 결함 때문에 몇 주째 데이터에서 통째로 빠지고 있었습니다.

덜 중요한 종목은 잘 쌓이는데 정작 제일 중요한 두 곳만 비어 있었던 겁니다. 다행히 원본은 이미 다 모아둔 상태라, 인식 버그만 고치니 수만 건이 순식간에 복구됐습니다.

수요일에 또 같은 유형의 버그가 나왔습니다. 이번엔 대형 종목의 흔한 줄임말이 인식 목록에 빠져 있던 것이었습니다.

여기서 방식을 바꿨습니다. 같은 패턴이 벌써 몇 번째 반복되는 걸 보고, 그냥 고치는 대신 다시는 안 생기게 만들기로 한 겁니다.

종목 이름 인식 로직이 프로젝트 여러 곳에 흩어져 각자 구현돼 있어서, 한 곳을 고쳐도 다른 곳은 낡은 채로 남는 구조였습니다. 이걸 공용 모듈 하나로 뽑아내서, 관련된 모든 곳이 그 하나만 가져다 쓰게 바꿨습니다. 이제 고칠 곳은 딱 한 군데입니다.

이 뉴스·게시판 수집 작업은 데이터 아카이브(새 창)로 따로 묶여 있는데, 이번 주엔 여기서 리테일 심리를 보려고 종목 토론 게시판 데이터를 모으는 작업도 새로 시작했습니다.

다만 진행 중인 비교 실험이 오염될까 봐, 수집만 먼저 하고 실제 반영은 뒤로 미뤘습니다. 데이터는 소멸되니 지금 모아두고, 판단은 급할 게 없으니 나중에 하자는 순서입니다.

전환점: WiFi가 15초 끊긴 사고

목요일이 이번 주의 전환점이었습니다.

집 와이파이가 새벽에 15초 정도 끊겼는데, 로그를 뜯어보니 실제 피해는 4시간 45분이었습니다. 다시 접속은 됐지만 데이터가 하나도 안 오가는 반쪽짜리 연결로 몇 시간을 그대로 있었던 겁니다.

더 뼈아팠던 건, 운영체제는 이미 4분 만에 인터넷이 안 된다는 걸 정확히 알고 있었다는 점입니다. 신호는 있었는데 아무도 그걸 읽고 있지 않았을 뿐입니다.

같은 날 밤, 야간 자동 분석이 절반도 못 끝내고 멈추는 더 큰 사고가 겹쳤습니다. 세 가지 문제가 한꺼번에 겹친 복합 사고였고, 그 중 하나가 이 네트워크 문제였습니다.

이 사고에서 오래 미뤄뒀던 원칙 하나를 확정했습니다. 가장 안전해야 할 것을, 가장 위험한 것의 성공에 묶어두지 말자는 겁니다.

분석에 쓸 입력을 기록하는 건 몇 분이면 끝나는 가벼운 작업이고, 그 뒤 무거운 계산은 몇 시간씩 걸리며 네트워크 같은 변수에 노출됩니다. 그런데 그동안은 가벼운 입력 기록이, 무거운 계산이 끝까지 성공해야만 완성되는 구조였습니다.

이번에 순서를 뒤집었습니다. 입력부터 확실히 저장해두고, 그 다음에 무거운 계산을 시작하게 바꿨습니다.

여기서 원칙 몇 개가 더 따라 나왔습니다. 데이터가 오래된 것과 틀린 것은 다르게 다뤄야 한다는 것 — 며칠 묵은 데이터로 판단하는 건 크게 위험하지 않지만, 서로 다른 시점이 뒤섞여 앞뒤가 안 맞는 숫자는 무조건 멈춰야 합니다.

경보도 마찬가지입니다. "이 알림을 받은 사람이 지금 할 수 있는 행동이 있는가"가 없으면, 급히 울릴 일이 아니라 나중에 모아 봐도 되는 일입니다.

이 와이파이 자동 복구 데몬은 네트워크 감시 프로그램(새 창)으로 따로 떼어 두고 있는데, 금요일엔 여기에 원격 접속이 끊기는 경우를 감시하는 기능도 더했습니다.

네트워크 자체가 죽었을 때와 원격 접속만 죽었을 때는 위험도가 다릅니다. 전자는 재부팅까지 써도 되지만, 후자는 본체가 멀쩡히 돌고 있을 수 있어 그 프로그램만 살살 되살리는 선에서 멈추게 했습니다.

실거래를 넓히기 전에, 믿을 수 없는 것부터 다 끄집어냈다

금요일과 토요일은 "이미 있는 걸 의심해보는" 날이었습니다.

금요일엔 AI에게 데이터를 넘기는 방식을 미리 모아 통째로 넘기는 쪽으로 바꿨더니 속도는 빨라졌는데, 리포트가 갑자기 영어로 나오기 시작했습니다. 한국어 데이터를 영어로 된 시스템 안내문 쪽에 실어 보내다 보니 AI가 지금 영어로 대화하는 상황이라고 착각한 것이었습니다.

형식을 바꾸는 것 자체가 AI에게 보내는 또 다른 신호였던 셈입니다. "원문이 영어여도 서술은 반드시 한국어로"라고 명시해 고쳤습니다.

그리고 토요일, 이번 주에서 가장 중요한 지점에 도달했습니다.

실제로 돈이 나가는 주문 코드는 이 프로젝트에서 가장 조심스러운 부분입니다. 실전에 쓰기 전에 외부 시각으로 한 번 더 감사를 맡겼는데, 결론은 "지금 상태로는 첫 실주문을 넣으면 안 된다"였습니다.

진짜 버그가 여럿 나왔습니다. 이중 주문을 막는 안전장치가 정작 확인 자체가 실패했을 때 조용히 통과하던 것, 주문 기록이 실패해도 주문은 그냥 나가던 경로 같은 것들입니다.

하나씩은 작아 보여도 전부 "평소엔 안 걸리다 특정 조건에서만 걸리는" 종류라, 감사 없이는 못 찾았을 것들이었습니다. 실계좌 자금이 걸린 유일한 경로라 시간을 넉넉히 들일 값어치가 있었습니다.

이 김에 증권사 선택도 다시 따져봤습니다. 처음엔 "굳이 안 옮겨도 된다"였는데, 하루 만에 뒤집혔습니다.

아직 실주문을 한 번도 안 넣은 지금이 증권사를 바꾸기 가장 싼 시점이기 때문입니다. 몇 주 더 쓴 뒤엔 쌓인 검증과 익숙함을 다 버려야 하지만, 지금은 버릴 게 없습니다.

접을 것은 접었다

오래 고민하던 아이디어 하나도 이번 주에 정리했습니다.

"장중에도 가벼운 AI 판단을 상시로 붙이면 어떨까"를 최종적으로 접었습니다. 장중에 빠르게 반응해야 하는 정보는 대부분 이미 시장 가격에 반영되고, AI가 값을 더할 수 있는 더 느린 정보는 이미 하루 단위 분석이 소화하고 있습니다.

상시로 돌릴 이유는 빈약한데 비용은 작지 않다는 게 최종 판단이었습니다. 대신 장중엔 규칙 기반 감지만 두고, AI 서술이 필요하면 그때만 온디맨드로 부르기로 했습니다.

맺으며

돌아보면 이번 주는 실거래라는 문턱을 앞에 두고, 그 문턱을 넘기 전에 믿을 수 없는 것부터 하나씩 끄집어낸 한 주였습니다.

데이터가 조용히 빠지고, 신호는 있었는데 아무도 안 읽고, 안전장치가 정작 필요할 때 통과해버리는 — 전부 "그때는 티가 안 나는" 것들이었습니다. 그리고 실제 돈이 걸리는 문턱 앞에선, 그 티 안 나는 것들이 가장 비싼 값을 치릅니다.

그래서 이번 주의 결론은 단순합니다. 넘어가기 전에 의심하고, 같은 실수는 고치지 말고 다시 안 생기게 만들자.

Top comments (0)