9일 만에 만든 주식 자동매매, 서버에서 24시간 돌리기까지 — 굳은 서버와 배포 스크립트의 구멍
자동매매를 제 PC에서 돌리면 PC를 끄는 순간 멈춥니다. 절전 모드에 들어가도, 윈도우 업데이트로 재부팅돼도 멈춥니다.
안녕하세요, 톱니바꿈입니다. 그래서 처음부터 클라우드의 리눅스 서버에서 돌리기로 했습니다. 오늘은 2026년 9월 5일 새벽 첫 코드를 올린 뒤 9월 13일까지 9일 동안 72번을 고쳐 만든 토스증권 OpenAPI 자동매매 시스템이 서버에서 멈추지 않고 돌기까지 겪은 일을 적습니다. 모두 제 전자책 「IMF의 증권사 개발자, AI와 9일 만에 자동매매를 만들다」에 기록한 내용입니다.
⚠️ 이 글과 책은 소프트웨어 개발 기록이며 투자 권유가 아닙니다. 특정 종목을 추천하거나 수익을 보장하지 않으며, 투자 판단과 결과의 책임은 투자자 본인에게 있습니다.

전자책 표지 — 표지의 1998년 392원·11,823원은 책 「들어가며」에 나오는 IMF 당시 사례이며, 수익을 약속하는 숫자가 아닙니다
9일 개발 연표로 먼저 봅니다
책 부록 D에 날짜별로 정리해 둔 흐름을 줄이면 이렇습니다.
- 9/5 — 최초 커밋, 로그인, 토스 OpenAPI 설정과 허용 IP 안내
- 9/6 — 서버 멈춤 해결(소켓 타임아웃·SQLite WAL·자동 재시작 설정), 실시간 서버 로그 창
- 9/10 — 사용자 설명서, 두 서버 배포 스크립트, 미국 주식 원화 환산
- 9/13 — 여러 회원이 쓰는 구조로 전환(구글·카카오 로그인, 구독, 관리자 화면)
- 9/14 — 책을 쓰며 배포가 DB를 덮어쓰던 문제 수정, 암호화 비밀키 교체와 기존 데이터 이전
서버는 두 대입니다. 혼자 쓰는 개인용 서버와, 여러 사람이 가입해 쓰는 멀티사용자용 서버입니다. 그리고 서버에서 돌릴 때 가장 많이 막히는 곳이 허용 IP였습니다. 토스증권 API에는 실제로 프로그램이 돌아갈 서버의 공인 IP를 등록해야 하고, 서버를 새로 만들면 다시 등록해야 합니다.
운영 이틀째, 서버가 굳었습니다
9월 6일, 화면이 뜨지 않고 로그도 더 이상 올라오지 않았습니다. 원인을 따라가 보니 세 가지가 겹쳐 있었습니다.
- 응답 없는 API 호출 — 호출 하나가 끝없이 기다리며 뒤의 작업을 모두 막았습니다. 소켓 타임아웃 5초를 걸었습니다.
- SQLite 동시 쓰기 — 15초마다 기록하는 엔진과 몇 초마다 새로고침하는 대시보드가 부딪혀 "database is locked"가 났습니다. WAL 모드로 바꿔 쓰는 중에도 읽을 수 있게 했습니다.
- 죽으면 끝 — 프로세스가 한 번 죽으면 사람이 다시 켤 때까지 멈춰 있었습니다. 자동 재시작 설정을 준비했습니다.

책 8장 「서버에서 24시간 돌리기」 — 9월 6일 서버 멈춤의 세 가지 원인과 해결
"Gunicorn으로 바꿔 줘"라고 하기 직전에 멈춘 이유
파이썬 웹 서비스를 운영 환경에 올릴 때는 보통 Gunicorn 같은 서버 프로그램으로 작업 프로세스를 여러 개 띄웁니다. 저도 처음에는 그게 고쳐야 할 부분이라고 생각해 AI에게 그렇게 요청하려 했습니다. 그런데 코드를 확인해 보니 매매 엔진과 급등 탐지는 python3 app.py로 직접 실행할 때만 시작되는 구조였습니다.
Gunicorn으로 바꾸면 화면은 멀쩡히 뜨는데 자동매매는 조용히 멈춥니다. 반대로 엔진 시작 코드를 위로 옮기면 작업 프로세스 4개가 엔진을 하나씩, 총 4개 띄워 같은 신호에 같은 주문이 4번 나갑니다. 그래서 책에는 이렇게 적었습니다. 자동매매 시스템에서 매매 엔진은 반드시 딱 하나만 돌아야 한다. 백그라운드 작업이 있는 서비스를 AI에게 맡기신다면, 요청문에 "엔진은 한 번만 떠야 한다"를 꼭 적어 주세요.
📖 9일의 전체 기록은 전자책에
토스증권 OpenAPI 연결부터 매매 신호 엔진, 리스크 관리, 서버 운영, 실전 전환 일주일의 시행착오까지 담았습니다. 읽기 모드로 먼저 살펴보세요.
편리한 배포 스크립트가 가장 위험했습니다
9월 10일, 명령 하나로 두 서버에 최신 파일을 복사하고 앱을 다시 시작하는 deploy_all.py를 만들었습니다. 서버가 두 대가 되면 손으로 하는 배포는 반드시 한쪽을 빠뜨리니까요.
그런데 책을 쓰려고 이 스크립트를 다시 읽다가 발견했습니다. 서버로 복사하는 파일 목록에 데이터베이스 파일이 함께 들어 있었습니다. 배포할 때마다 제 PC의 테스트 데이터베이스가 서버의 데이터베이스를 덮어쓸 수 있는 구조였습니다. 같은 날, 회원들의 토스 키를 암호화하는 비밀키가 코드에 기본값으로 적혀 있다는 것도 찾았습니다.
하루 동안 고친 순서
- 배포 목록에서 데이터베이스 파일을 뺐습니다.
- 비밀키를 코드에서 지우고, 서버마다 무작위 키를 만들어 파일로 보관하게 했습니다.
- 옛 키로 암호화된 데이터를 풀어 새 키로 다시 암호화하는 이전 스크립트를 만들었습니다.
- 서버마다 앱 중지 → 데이터베이스 백업 → 미리보기 → 확인 후 적용 → 모의투자로 검증 순서로 진행했습니다.
그날 배운 것은 두 가지입니다. 배포 스크립트에는 "무엇을 보내는지"만큼 "무엇을 절대 보내지 않는지"를 적어야 하고, 실패를 숨기는 코드는 사고를 늦게 발견하게 만든다는 것입니다.

책 부록 D 「9일 개발 연표」 — 9/5 최초 커밋부터 실전으로 넘어간 일주일(9/14~9/21)까지
1998년 증권 전산에서 배운 원칙 그대로
1998년, 저는 H증권사에서 펀드매니저들이 쓰는 시스템을 만들던 개발자였습니다. 그때 몸에 밴 원칙이 있습니다. 돈을 다루는 시스템은 잘 돌아갈 때가 아니라, 무언가 잘못됐을 때 어떻게 행동하는지로 평가받는다. 서버가 굳은 날도, 배포 스크립트의 구멍을 찾은 날도 결국 이 문장으로 돌아왔습니다.
이 문제들은 9일 동안 한 번도 겉으로 드러나지 않았습니다. 책을 쓰며 코드를 처음부터 다시 읽지 않았다면 지금도 몰랐을 겁니다. 그래서 자동매매를 직접 만들어 보시려는 분께 드리고 싶은 말은 하나입니다. 실전 돈을 넣기 전에 모의투자로 충분히 검증하고, 잃어도 되는 금액으로만 시작하세요.
책으로 이어 읽기
- 「IMF의 증권사 개발자, AI와 9일 만에 자동매매를 만들다」 읽기 모드 — 8장 「서버에서 24시간 돌리기」, 9장 「실전 트러블슈팅」
- AI월드에서 상품 보기·문의하기
댓글
댓글 쓰기