안녕하세요. 눈팅만 하다가 처음 글 써봅니다.
저는 주식을 꾸준히 하고 있습니다. 몇년전부터 한국장이 너무 저렴한거 아닌가 싶어서 한국장 비중을 좀 높였었구요. 그런데 주식을 하다가 "저평가 종목 조건 걸어서 찾는 거, 매번 공시 뒤지지 말고 자동화하면 편하겠다"는 생각에서 시작한 사이드 프로젝트를 몇 달째 만들고 다듬고 있어서 공유해봅니다. (한마디로 제가 쉽고 편하게 주식종목을 고르기 위해서 시작하게 되었어요.)

1. 뭘 만들었나
DART(금융감독원) 공시랑 KRX 시세 데이터를 매일 자동 수집해서, PER·PBR·ROE·부채비율 같은 재무 조건으로 종목을 필터링해주는 스크리닝 서비스입니다. 그레이엄·버핏·린치 같은 유명 투자자들 전략을 미리 조건화해둔 "기본 전략" 탭도 있고, 조건을 직접 조합하는 "커스텀 전략"도 있습니다.


2. 기술적으로 겪은 것들
백엔드는 Node.js + Express, 프론트는 React + Vite입니다. DB를 역할별로 5개 MySQL로 나눠서 쓰는데(원본 데이터 DB / 가공된 재무지표 DB / 처리된 주가 DB 이런 식으로), 처음엔 "그냥 하나로 합치면 편한데 왜 이렇게 나눴지" 싶었지만 수집 파이프라인이 커지면서 한 DB당 용량제한에 걸리더라구요. 그래서 어쩔수 없이 5개로 나눠서 관리를 하게 되었습니다.(원본데이터 받다가 나중에 알아서 데이터베이스 늘리고, 데이터베이스별로 데이터 따로 받는 뻘짓을 많이 했죠.ㅜㅜ 그래도 원본과 가공 데이터를 분리해둔 게 디버깅할 때 꽤 도움이 됐습니다. 대신 관리 포인트는 확실히 늘어나더라고요.
DART 공시 API는 기업마다 재무제표 포맷이 미묘하게 다릅니다. 이부분때문에 파싱하는게 꽤 힘들었습니다. 그리고 사업개요도 업체마다 다른구조로 작성되어있다보니까 쉽지 않더라구요. 그리고 외국주권으로 상장된 종목이라던가, 결산월이 12월이 아닌 곳들이 섞여있어서 파싱 예외 케이스 처리에도 생각보다 시간을 많이 썼습니다. 지금도 "이 종목만 재무데이터가 안 들어온다"는 이슈가 가끔 튀어나와요.




매일 새벽에 GitHub Actions로 수집 크론을 돌리는데, 15분 간격으로 실시간 시세를 가져오는 쪽은 회전 IP 때문에 자꾸 방화벽(fail2ban)에 막히는 문제가 있었습니다. 결국 고정 IP를 쓰는 self-hosted 러너로 옮겨서 해결했는데, 원인 찾는 데 꽤 헤맸네요.
저는 Claude Code로 작업을 합니다.(프로 사용자라 오퍼스, 소넷 왔다갔다하면서 진행하네요. 항상 사용량 모자라서 빠르게 생각한대로 작업을 진행하진 못하지만 계속 꾸준히 하고는 있네요.) 프로젝트가 커지면서 "공통 함수 하나 고쳤다가 다른 화면에서 예상 못한 부작용이 생기는" 패턴을 몇 번 겪고 나서, 이제는 함수 고치기 전에 호출부를 전부 검색해보고 실제 데이터 분포를 SQL로 먼저 확인하는 걸 규칙으로 만들어뒀습니다. AI한테 시켜도 "아마 이걸 쓸 것"이라는 추측성 판단은 꼭 틀리더라고요.
프로젝트가 점점 커지니까 점점 생각지 못했던 일들이 생기니까 매번매번이 새롭습니다.ㅎ
3. 앞으로 할 것
인사이트/리서치 콘텐츠 쌓기, 모바일 화면 다듬기, 조건 충족 시 알려주는 알림 기능 등 좀 더 고도화를 계획 중입니다.
아직 계속 고치고 있는 1인 프로젝트라 부족한 점 많습니다. 써보시고 이상한 점이나 "이렇게 하면 낫다" 싶은 조언 있으시면 댓글로 편하게 남겨주세요.
감사합니다.