헬스체크는 200을 반환했다, 그런데 내 서버는 없었다
uvicorn을 네이티브로 띄웠다고 생각했는데 헬스체크가 200을 반환한다. 서버가 잘 떴다고 믿고 계속 개발했다. 알고 보니 OrbStack의 Docker 컨테이너가 같은 포트를 점유하고 있었고, 내가 수정한 코드는 실행 중이 아니었다.
uvicorn을 네이티브로 띄웠다고 생각했는데 헬스체크가 200을 반환한다. 서버가 잘 떴다고 믿고 계속 개발했다. 알고 보니 OrbStack의 Docker 컨테이너가 같은 포트를 점유하고 있었고, 내가 수정한 코드는 실행 중이 아니었다.
코드 마이그레이션 후 특정 엔드포인트에서 간헐적 500 에러가 발생했다. 원인은 마이그레이션 중 일부 코드가 timezone-aware datetime을 naive로 변환해서 빼려고 했던 것. TypeError 한 줄이 모니터링을 통과한 이유까지 정리했다.
매도 주문 API가 성공 응답을 반환했다. 그런데 실제 체결이 되지 않았고, 시스템은 이미 체결로 기록했다. KIS API 응답과 실제 체결 사이의 간극, 그리고 이를 방어하는 KIS-truth 재검증 패턴을 정리했다.
KIS API 클라이언트에 connect timeout을 60초로 설정했더니, 연결이 느려지는 순간 요청이 수십 개 쌓였다. 타임아웃을 길게 잡을수록 안전하다는 착각이 만든 사고다.
신규 포지션을 잡은 직후 첫 번째 스케줄러 사이클에서 WebSocket 시세가 오지 않았다. 원인은 구독 동기화 함수의 호출 위치가 holdings 동기화보다 앞에 있었기 때문이다.
APScheduler job이 매주 일요일 새벽 2시에 실행됐지만 전략 파라미터는 5주 동안 한 번도 업데이트되지 않았다. 에러는 있었다. 로그에도 찍혀 있었다. 그런데 왜 아무도 몰랐을까.