"[260907~0913] 공유계좌 실거래 전환 - 계좌 구분값 누락이 반복해서 문제를 일으켰다"
새 공유계좌로 실거래를 시작했고, 그 과정에서 계좌 구분값을 안 넘기거나 전역으로 공유해버리는 같은 유형의 버그가 킬스위치 오발과 강제매도로 여러 번 반복됐습니다
이번 주의 전환점 - 공유계좌로 첫 실주문
이번 주 흐름을 가른 건 수요일이었습니다.
기존 실거래 계좌는 봇 전용이라 계좌 전체가 봇 것이라는 전제로 실행 안전장치(새 창)를 짜뒀습니다.
이번에 새로 투입한 계좌는 그 전제가 깨집니다. 개인 자금과 봇 운용 자금이 한 계좌 안에 같이 들어있는 공유계좌였습니다.
매수 여력에서 개인 자금을 걸러내고, 잔고의 소유자를 판정하고, 매도 시 개인 보유분은 절대 건드리지 않는다는 불변식을 코드 레벨에서 못박는 재설계를 거친 뒤, 수요일에 이 계좌로 첫 실주문을 냈습니다. 성공이었습니다.
계좌 간 자금 이관 방식도 같은 날 확정됐습니다. 은행 이체 없이, 기존 계좌가 팔면 그 라운드 안에 새 계좌가 자동으로 예산에 반영해서 사는 장부상 자동전환 방식이었습니다.
목요일 아침 기존 계좌 보유 종목의 실물 이관도 정상 접수됐습니다. 여기서부터 한 주의 나머지가 이 새 계좌를 둘러싼 뒷수습으로 채워졌습니다.
반복된 사고 패턴 - 계좌 구분값을 빠뜨리거나 공유해버린다
이관이 시작된 목요일부터, 겉으로는 서로 다른 버그처럼 보이는 사고 세 건이 실은 같은 유형이었습니다. "이 처리가 어느 계좌 소속인지"를 명시하지 않으면 시스템이 기본값이나 전역 상태로 흘러가 버리는 문제였습니다.
목요일엔 기존 계좌에서 새 계좌로 넘어간 현금 자동전환 로직이 필드 이름 하나가 잘못 매핑돼서 하루 종일 한 번도 발동하지 않았습니다. 금요일엔 "이미 이관한 종목은 도로 사지 말라"는 방지 플래그가 계좌별로 분리되지 않고 시스템 전체가 공유하는 파일 하나에 저장되고 있다는 게 드러났습니다.
그 결과 방금 이관받아 계속 보유해야 할 새 계좌 종목까지 "랭킹 제외 대상"으로 취급되면서, 이관 몇 시간 만에 해당 종목이 강제매도됐습니다. 이관의 취지와 정반대로 작동한 셈이라, 발견 즉시 플래그 파일을 비웠습니다.
토요일엔 더 무거운 사고가 났습니다. 정보용으로만 도는 모의 시뮬레이션 틱이 계좌 구분값을 넘기지 않으면서 실계좌 쪽 킬스위치 이름공간을 그대로 공유해버렸습니다.
이 모의 틱이 참고하는 계좌는 실계좌와 무관한 예전 소액 계좌였는데, 그 잔고를 실계좌 누적 고점과 비교하면서 시스템이 실계좌가 하루 만에 절반 가까이 손실 난 것으로 오판했습니다. 킬스위치가 발동해 신규 매수·매도가 전부 정지됐습니다.
주말이라 당장 피해는 없었지만, 그대로 뒀으면 월요일 실거래가 통째로 막힐 뻔했습니다.
일요일 사후검토에서 더 중요한 걸 하나 더 찾았습니다. 토요일에 증상만 지우고 넘어갔는데, 금요일에 있었던 계좌 출금 처리가 손실 추적 기준점(고점)을 다시 잡는 절차 없이 장부에만 반영돼 있었던 겁니다.
기준점이 안 낮춰진 채로 남아있으면 월요일 정기 라운드에서 지금 잔고를 오래된 높은 기준점과 또 비교하게 되고, 같은 킬스위치가 재발할 뻔했습니다. 발견 즉시 기준점을 다시 잡았고, 같은 계좌 구분값 문제가 남아있던 곳 두 군데도 추가로 고쳤습니다.
세 사고 모두 근본 원인은 하나입니다. 계좌 구분값을 명시적으로 지정하지 않으면 시스템이 기본값이나 공유 상태로 새버린다는 것. 앞으로 이 값을 다루는 코드는 항상 명시적으로 지정하기로 규칙을 남겼습니다.
그래픽카드 인식 실패, 몇 주 만에 진짜 원인을 찾았다
지난주 한 번 고쳤다고 생각했던 그래픽카드 인식 실패가 이번 주 다시 재발했습니다.
원래 의심했던 절전 기능은 실측으로 기각됐고, 진짜 원인은 화면 관리 프로그램이었습니다. 다중 그래픽카드 환경에서 이 프로그램이 가끔 충돌해 재시작되는데, 그 과정에서 그래픽카드 접근 권한이 로그인 세션 계정에서 다른 시스템 계정으로 슬쩍 넘어가 있었습니다.
몇 시간 잠복해 있다가 다음 날 새벽 작업이 그래픽카드를 찾으려는 순간 실패로 터져 나오는 구조였습니다. 권한 체계 자체를 바꿔서 경쟁 상황을 없애는 근본 수선을 적용하고 재부팅으로 검증했고, 이후 재발은 없었습니다.
토요일 새벽엔 별도로 운영체제 자동 업데이트가 드라이버 일부만 올리면서 버전이 어긋나는 사고도 한 번 더 있었는데, 장이 없는 날이라 여유 있게 재부팅으로 처리했습니다.
성능 자동튜닝 도구 - 설계에서 실행까지
그래픽카드나 모델을 바꿀 때마다 성능 튜닝을 반복해온 작업을 자동화하는 도구를 이번 주에 설계하고 구현했습니다.
금요일엔 실측 부하를 재생해서 파라미터를 탐색하고 결과를 검증하는 구조를 설계만 했고, GPU를 건드릴 수 있는 권한과 설계만 담당하는 권한을 분리해서 설계 쪽 실수가 운영 서비스를 건드리지 못하게 막아뒀습니다.
일요일엔 이 설계를 실제로 구현했습니다. AI 코드리뷰에서 기준선 판정 로직이 시행 번호의 이름 규칙만 보고 있어서 기준선이 조용히 계속 바뀔 뻔한 버그를 포함해 여러 건을 잡았습니다.
실제 그래픽카드로 첫 실행을 시도했는데, 실행 엔진의 핵심 단계 일부가 아직 자리만 잡아둔 미구현 상태였습니다. 정해진 경로로만 그래픽카드를 건드린다는 안전 원칙상 즉석 우회 코드로 채우지 않고, 우회 없이 실행을 중단시킨 뒤 다음 세션으로 넘겼습니다.
같은 날 여분 그래픽카드로, 포트 충돌 시 프로덕션 프로세스만 정확히 골라 정리하는 안전장치도 처음으로 실측 검증했습니다. 지금까지는 코드 단위 테스트로만 확인돼 있었는데, 진짜 운영체제 프로세스 두 개를 띄워 충돌을 재현해보니 프로덕션만 정확히 정리되고 실험 프로세스는 살아남는 걸 확인했습니다.
그 외
월요일엔 증권사 API 잔고 조회가 여러 페이지로 나뉘어 오는데 첫 페이지만 읽어서 보유 종목 하나가 통째로 빠지는 버그를 잡았습니다. 같은 유형의 페이지네이션 버그가 목요일 대사 사고의 원인 중 하나로 다시 나타나서, 비슷한 구조의 다른 API 호출도 점검 대상으로 남겨뒀습니다.
화요일엔 증권사 로그인 자격증명 로딩 순서 버그를 고치다가, 고치지 않고 배포했으면 로그인 성공 순간 계정 정보가 로그에 평문으로 남을 뻔한 유출 위험을 함께 발견해 막았습니다. 종목 유니버스 편입 경계에도 완충 규칙을 추가해서 경계선 근처 순위 흔들림으로 인한 잦은 편입·탈락을 줄였습니다.
회전을 줄이기 위한 최소 보유기간 규칙도 모의계좌 양쪽에 적용해서 검증에 들어갔습니다.
한 주를 돌아보면, 공유계좌라는 새로운 전제 하나가 도입되면서 그동안 "계좌는 하나"라고 암묵적으로 가정했던 코드 곳곳이 차례로 드러났습니다.
킬스위치 오발도, 강제매도도, 현금 자동전환 실패도 결국 같은 구멍이었습니다. 다행히 매번 실거래가 실제로 막히기 전에 발견해서 고쳤고, 일요일 사후검토로 남아있던 뿌리까지 찾아 정리했습니다.