Joyuno's Dev Blog

2026-03-24 (화) 개발일지

dev-blog

오늘의 개발 일지: Discord 봇부터 투자 보고서까지, 삽질과 해결의 하루

오늘은 여러 프로젝트를 왔다갔다하면서 각각 다른 문제들을 마주쳤고, 그 과정에서 배운 점들이 많았던 하루였다. 아침부터 저녁까지 정말 다양한 도메인을 넘나들었는데, 이제 하나씩 정리해보려고 한다.

Discord 봇이 말을 안 듣는 문제

오늘 가장 먼저 마주친 문제는 votr(보트) 프로젝트의 Discord 봇이 갑자기 응답을 하지 않는 것이었다. 어제까지 잘 작동하던 봇이 오늘 아침에는 DM을 보내도 아무 반응이 없었다.

처음에는 봇 토큰이 문제인 줄 알았다. ~/.claude/channels/discord/.env 파일을 확인해보니 토큰은 정상적으로 설정되어 있었다. 그런데 로그를 더 자세히 보니 재미있는 사실을 발견했다. claude-wrapper 프로세스는 실행 중이었지만, 실제 Discord 봇 MCP 서버(bun server.ts)가 실행되지 않고 있었다.

문제의 원인은 bun이 PATH에 없어서 서버가 시작조차 못 하고 있었던 것! ~/.bun/bin/bun에 설치되어 있지만 PATH에 포함되지 않아서 Discord MCP 서버가 시작되지 않았다. 이걸 발견하고 나서야 “아, 이게 문제였구나” 싶었다.

해결은 간단했다. Bun을 재설치하고 PATH를 설정해주니 바로 작동했다. 배운 점은 “프로세스가 실행 중인 것처럼 보여도, 실제 서버는 시작되지 않을 수 있다”는 것. 로그를 꼼꼼히 확인해야 한다는 교훈을 얻었다.

투자 보고서의 세 가지 문제점

투자보고서 프로젝트에서 사용자로부터 4가지 문제점을 제보받았다:

  1. 한국 추천 종목별 뉴스가 아닌 일반 뉴스가 표시됨
  2. 모든 한국 종목별 뉴스가 동일함
  3. 미국 주식 데이터를 읽어오지 못함
  4. 시그널 검증이 필요함

첫 번째 문제를 해결하기 위해 한국 뉴스 API를 살펴보니, newsListJson.nhn API가 종목 코드와 무관하게 동일한 시장 뉴스를 반환하고 있었다. 해결책은 /api/news/stock/{code} 엔드포인트로 변경하는 것이었는데, 이렇게 하니 각 종목마다 다른 뉴스가 정상 출력되기 시작했다.

미국 주식 문제는 더 재미있었다. yfinance 데이터는 정상적으로 가져오는데(예: SMCI의 RSI=26.8), 스크리너 로직에 문제가 있었다. 디버깅을 해보니 미국 스크리너가 500개 이상 종목 각각에 대해 기관 데이터를 개별 API 호출하고 있어서 시간 초과가 발생하고 있었다.

최적화 방법을 바꾸어서 4개 필터를 먼저 적용하고, 2개 이상 통과한 종목만 기관 데이터를 조회하도록 수정했다. 이렇게 하니 처리 시간이 크게 단축되었다. 배운 점은 “데이터를 모두 가져온 다음 필터링하지 말고, 가능한 한 먼저 필터링하라”는 성능 최적화의 기본 원칙이었다.

자소서 작성과 포트폴리오 관리

LGU+ B2B 영업 신입 채용을 위한 자소서를 작성하면서 느낀 점은, 기술적인 경험을 비기술 직무에 어떻게 어필할지가 중요하다는 것이었다. 다변량통계분석, 계량경제학, 졸업논문(금융) 이 세 과목을 선정하고, 각각이 빅데이터 분석 능력, 재무 모델링 이해도, 금융 지식으로 연결될 수 있도록 구성했다.

특히 My Story 1과 2를 400자 이내로 맞추는 작업이 생각보다 까다로웠다. 글자 수를 세가면서 불필요한 표현을 줄이고 핵심만 전달하는 연습을 할 수 있었다. 기술자가 비기술 직무에 지원할 때는 “기술 지식을 어떻게 비즈니스 가치로 전환할 수 있는지” 보여주는 것이 중요하다는 것을 다시 한번 깨달았다.

dev-report에서 dev-blog로의 전환

옵시디언 정리 프로젝트에서 dev-report가 자동 업데이트되지 않는 문제를 해결했다. 원인은 git push가 실패했기 때문이었는데, 리모트에 새 커밋이 있어서 push가 거부된 상태였다.

upload_blog.py의 push 재시도 로직을 확인해보니, git push 실패 시 git pull --rebase 결과를 체크하지 않고 있었고, rebase 충돌이 나면 그대로 실패하고 있었다. push 전에 먼저 pull을 하도록 순서를 바꾸고, merge 폴백에 --no-rebase 플래그를 추가해서 해결했다.

더 중요한 것은 리포트 방식을 완전히 바꾸기로 결정한 점이다. 기존의 형식적인 리포트 대신, 세션 로그들을 분석해서 마치 내가 생각하며 쓴 것 같은 스토리텔링 방식의 개발 블로그 글을 작성하는 방식으로 개선하기로 했다. 이렇게 하면 단순 작업 나열이 아니라, “왜 이 작업을 했고 → 어떤 문제를 마주했고 → 어떻게 해결했는지” 의 흐름이 생기면서 훨씬 가치 있는 기록이 될 것 같다.

드롭쉬핑 자동화의 Shopify 앱 문제

CJ Dropshipping API 키 발급 과정에서 Shopify 앱 설치 문제가 발생했다. 앱은 설치되었다고 하는데 API 페이지에서는 로그인이 안되고 무한 리디렉션되는 문제였다.

해결책은 간단했지만 생각치 못한 부분이었다. CJ Shopify 앱과 CJ 개발자 API는 별개라는 사실! Shopify 앱을 통하지 않고 직접 CJ 메인 사이트에서 개발자 포털에 접속하니 문제가 해결되었다.

또한 포트 충돌 문제도 있었는데, 포트 4001은 이미 사용 중이어서 3039로 변경하고, 엔진도 4039로 변경해서 통일했다. 서비스 이름도 AIIV에서 MutBe로 변경하면서 관련 파일들을 일괄 수정하는 작업을 진행했다. 이런 대규모 리네이밍 작업에서는 일괄 변경 스크립트를 사용하는 것이 필수라는 것을 다시 한번 느꼈다.

자동매매의 시간외 거래 문제

자동매매 시스템에서 프리마켓(한국시간 오후 6시까지) 거래가 진행되지 않는 문제를 발견했다. KIS API 키는 정상이었는데, 문제는 시간외 거래 시간 로직이 너무 좁게 설정되어 있었다.

기존 코드는 _is_market_open() 함수가 is_signal_check_hours()를 호출하면서 08:50~15:40만 허용하고 있었다. 시간외 거래(08:30~18:00)까지 포함하도록 수정하니 정상적으로 작동하기 시작했다.

이 문제에서 배운 점은 “시장 시간 로직을 하드코딩할 때는 시간외 거래까지 고려해야 한다”는 것이었다. 특히 한국 주식시장은 장중 거래 외에도 시간외 단일가, 시간외 종가 등 다양한 세션이 있어서 더 주의가 필요하다.

OpenClaw 서비스 정리

유튜브(좌우파) 프로젝트에서 OpenClaw 서비스를 완전히 정리했다. pkill로 프로세스를 종료해도 자동으로 다시 살아나는 문제가 있었는데, 이는 launchctl 서비스로 등록되어 있어서 그런 것이었다.

launchctl unload로 서비스를 언로드하고, plist 파일까지 정리하니 완전히 비활성화되었다. macOS에서 백그라운드 서비스를 관리할 때는 프로세스 종료만으로는 부족하고, launchctl 등록까지 해제해야 한다는 것을 배웠다.

오늘의