2026-04-16 (목) 개발일지
오늘의 TIL: 사주 앱 프리미엄 기능, 소명 시스템 디버깅, 그리고 트레이딩 봇의 삽질 기록
오늘은 정말 다양한 프로젝트를 오가며 머리를 싸맸던 하루였다. 아침부터 저녁까지 사주 앱, 소명 처리 시스템, 트레이딩 봇을 넘나들었는데, 각각의 문제들이 서로 다른 차원의 고민을 던져줬다.
사주 앱: LLM 기반 프리미엄 궁합 분석 구현
사용자로부터 “운세 페이지가 너무 단순하다”는 피드백을 받았다. 현재는 일간 오행 관계만 보고 5가지 고정 템플릿을 출력하는 수준이라, 정말로 의미 있는 운세 분석이라고 보기 어렵다.
문제: 사용자들이 만세력 기반 종합 운세를 원했고, 특히 유료화 모델을 고민 중이었다.
시도: 처음에는 HuggingFace에서 사주 특화 fine-tune 모델을 찾아봤다. peizhuc/fortune-teller-gguf 같은 모델들이 있었지만, 한국어 지원이나 품질에서 아쉬운 점이 많았다. 결국 Claude API를 사용하는 방향으로 결정했다.
해결: Haiku 모델을 사용하면 상세 궁합 1회 분석에 약 $0.003(0.4원)밖에 안 들어서 경제적이었다. 무료로 기본 기능을 제공하고, 유료 결제시 Claude API로 상세 궁합을 보여주는 구조로 구현했다. 백엔드에 is_premium 플래그를 추가하고, 궁합 분석 엔드포인트를 만들었다. Flutter에서는 프리미엄 페이월과 상세 궁합 화면을 구현했다.
배운 점: LLM API를 유료 기능에 접목할 때는 비용 계산이 정말 중요하다. 사용자당 수익이 API 비용을 훨씬 상회해야 한다는 기본 원칙을 다시 한번 깨달았다.
소명 처리 시스템: 메일 발송의 복잡한 인프라 문제
이게 오늘 가장 머리 아팠던 부분이다. 소명 폼이 제대로 동작하지 않는 문제를 해결하려다 보니, 서버 인프라의 복잡성을 마주하게 됐다.
문제: .34 서버에서 소명 메일이 발송되는데, 메일 링크를 클릭하면 404 에러가 발생했다. 분명히 .37 서버에서 토큰을 생성했는데 말이다.
시도: 처음에는 nginx 프록시 설정이 잘못된 줄 알았다. /api/v1/public/ 경로가 제대로 프록시되는지 확인하고, 설정을 수정해봤다.
해결: 알고 보니 .34 서버에는 tr-box2라는 별도 배포본이 실행 중이었다! .37과 .34는 완전히 별개의 백엔드와 DB를 사용하고 있었다. .37에서 생성한 토큰이 .34의 DB에는 존재하지 않아서 404가 발생한 것이었다. 결국 두 서버 간의 데이터 동기화 문제였는데, 근본적인 해결보다는 .34의 nginx에 /public/ 프록시를 추가하는 임시방편을 선택했다.
배운 점: “같은 서비스”라고 생각했는데 실제로는 별도의 인스턴스가 따로 돌고 있을 수 있다. 특히 테스트 서버와 운영 서버를 분리해놓은 경우, 데이터 일관성을 반드시 확인해야 한다.
bit-scalp: 트레이딩 봇의 실전 버그 수정
트레이딩 봇 대시보드에 숫자가 제대로 표시되지 않는 문제부터 시작해서, 실제 Binance 모의 투자에 주문이 반영되지 않는 문제까지 연쇄적인 버그를 마주했다.
문제1: 대시보드에 WebSocket 데이터가 전혀 표시되지 않았다.
해결1: get_account_state() 함수가 2초마다 Binance API를 호출하면서 에러가 발생하고 있었고, broadcast 루프에서 이 에러를 조용히 삼키고 있었다. 에러 처리 로직을 추가하고, API 호출 빈도를 조정했다.
문제2: Binance 모의 투자에 주문 기록이 안 찍혔다.
해결2: API 서명(signature) 생성 방식에 문제가 있었다. Binance API는 파라미터를 정렬해서 서명하면 안 되는데, sorted(params.items())를 사용하고 있었다. query string에서 직접 서명을 생성하도록 수정했다.
문제3: SL/TP(손절/익절) 주문이 실패했다.
해결3: stopPrice의 소수점 문제였다. price와 stop_price 모두 적절하게 반올림하는 로직을 추가했다.
배운 점: 트레이딩 봇은 “거의 다 됐는데”라는 말이 통하지 않는 세계다. API 서명 한 줄, 소수점 처리 하나가 실제 손실로 이어질 수 있다. 모든 에러를 조용히 삼키지 말고 명시적으로 로깅해야 한다는 교훈을 얻었다.
부수적 발견: Claude Code Routines
오늘 중간에 Claude의 새 기능인 “Routines”을 발견했다. 일일 15회 제한으로 클라우드에서 자동 반복 실행이 가능한 기능인데, 노트북을 닫아도 돌아간다니 꽤 유용할 것 같다. Pro 플랜은 5회, Team 플랜은 15회까지 가능하다고 한다. 다음에 장기 실행 태스크가 필요할 때 한번 써봐야겠다.
오늘의 한줄
“서버 인프라의 투명성, API의 디테일, 비즈니스 모델의 경제성 - 세 가지 다른 차원의 문제를 하루 안에 해결하려다 보니 머릿속이 만국 지도처럼 뒤섞인 날이었다.”