지표 1개짜리 파이프라인을 4개 대시보드·데이터소스 20개 이상으로 확장하면서, 자동화가 반복해서 멈추는 걸 끝까지 쫓아가며 바이브 코딩에 대한 이해가 확 깊어진 시간의 기록.
<한 줄 요약>
1주차 끝에 지표 1개뿐이던 파이프라인을, 열흘 만에 거시경제·반도체·자산현황·주요이슈 4개 대시보드로 확장했다. 그 과정에서 자동화가 몇 번이나 "이유 없이" 멈췄고, 그걸 끝까지 쫓아가며 원인을 하나씩 찾아낸 게 이번 주의 진짜 배움이었다.
<누구에게 도움이 될까>
"막연히 구상만 있던 걸 실제로 구조를 잡아 만들어가는" 단계에 있는 사람, 그리고 "자동화를 만들었는데 왜 자꾸 멈추지?"를 겪고 있는 사람.
1. 바이브 코딩의 기록 (개인 투자 에이전트 구축)
(8/1) 지표 1개를 15개로, 계획을 중간에 다시 짠 첫날
#일반화#계획 재검토
1주차 끝에 만든 기준금리 파이프라인은 지표 1개, 그래프도 없는 상태였다. 인자만 바꾸면 아무 FRED 지표나 가져올 수 있게 스크립트를 일반화해서 하루 만에 15개로 늘렸다.
그래프를 붙이는 중 "1년치만 보여줄까?"로 정해뒀던 원래 계획을 스스로 멈추고 다시 짰다 — 실제 데이터량을 재보니 전체 기간을 다 저장해두고 기간 버튼(3개월/1년/3년/5년/전체)으로 골라보는 게 낫다는 걸 깨달았기 때문이다.
💡 이날의 배움 · 계획은 세웠다고 끝이 아니라, 실제로 만들어보면서 계속 고쳐도 된다는 감각을 여기서 처음 얻었다.
(8/4) "네이버 금융이랑 뭐가 다르지?"에서 시작한 뉴스 기능
#RSS 조사#프롬프트 설계#장애 발생
지표를 다 채우고 나니 스스로 질문이 생겼다. "이거 그냥 네이버 금융 보는 거랑 뭐가 다른가?" 이 질문 하나가 이번 주에서 제일 많은 걸 만들어낸 하루(개념·사례 6편)로 이어졌다.
유사 사례를 조사하고, 언론사 RSS 26곳을 후보로 골라 하나하나 코드로 직접 접속해 살아있는지 검증했다. RSS가 표준이라고 믿었던 게 틀렸다는 걸 알 았다 — 어떤 곳은 인코딩이 EUC-KR이고, 어떤 곳은 날짜 정보 자체가 없고, 어떤 곳은 피드 주소는 살아있지만 2020년 기사에서 멈춰 있었다.
뉴스를 "글로벌/한국"으로 나눌 때 AI가 "누가 썼는지(언론사)"로 판단하고 있어서, "어디서 일어난 일인지(내용)"로 명시해줘야 했다.
같은 날 자동화가 처음으로 6시간씩 이틀 연속 멈췄다(RSS엔 타임아웃을 걸어뒀는데 Gemini 호출엔 깜빡했다). "네이버 검색 API 하루 25,000회 무료"라는 예전 정보를 믿고 신청하려다, 신청 화면 안내가 달라진 걸 눈치채고 카드 등록 직전에 멈춰서 확인했다 — 결제수단을 실제로 등록하기 전이 마지막 안전선이라는 걸 배운 순간이다.
💬 재사용 프롬프트
"너는 투자 정보 대시보드용 뉴스 편집자야… 실제 링크는 네가 직접 옮겨 적지 마라. 대신 원본 id 배열만 알려주면 내 코드가 정확한 링크를 찾아서 채워넣는다."
AI에게 긴 URL을 손으로 베끼게 하지 않고, id로만 참조시키는 패턴은 이후에도 계속 재사용했다.
(8/5–8/6) 반도체 대시보드 설계 확정, 그래프가 안 보이는 버그를 잡다
#설계 확정#디버깅
PRD에서 "구현 단계에서 정하자"고 미뤄뒀던 반도체 대시보드를 실제로 조사하며 설계를 확정했다 — 데이터소스, 종목 20개 선정(SMH·TIGER 반도체TOP10 지수 차용), 편입/제외 종목을 어떻게 계속 추적할지까지.
SIA(미국반도체산업협회) 사이트가 GitHub Actions 서버를 막아버린 걸 계기로 "출처 하나가 실패해도 이미 받은 나머지는 지킨다"는 원칙을 코드에 넣었다.
바로 다음 날, 종목 상세페이지 그래프가 에러 하나 없이 계속 텅 비어있는 문제를 만났다. 콘솔에서 의심되는 한 줄(import('chart.js/auto'))만 떼어 실행해보니 원인이 바로 나왔다 — Astro의 define:vars 방식으로 쓴 스크립트는 번들링이 안 된다는 것.
💡 이날의 배움 · 조용히 실패할 땐 의심 가는 코드 한 줄만 따로 떼어 실행해보는 게 제일 빠르다.
(8/7) "고쳤다"고 생각했는데 또 멈췄던 날
#반복된 실수#전수 조사#보안 점검
이번 주에서 가장 크게 배운 날이다. 8/4에 타임아웃을 이미 한 번 고쳤는데, 8/7에 국민일보 전용 코드에서 또 같은 실수(타임아웃 누락)를 발견했다.
한 번 잡은 실수도 새 코드를 짤 때 또 저지를 수 있다는 걸 깨닫고, 그 자리에서 프로젝트 전체 fetch( 호출을 검색해 5곳을 추가로 더 찾아 고쳤다.
같은 날 환경변수 이름을 소문자로 등록했는데 코드는 대문자를 찾고 있어서 인식이 안 됐던 걸 잡았고(대소문자까지 정확히 일치해야 함), 바이브코딩 사이트들의 API 키 유출 사고 조사자료를 보고 내 프로젝트를 직접 점검해 전부 깨끗하다는 걸 확인했다.
💡 이날의 배움 · 한 번 잡은 실수도 새 코드를 짤 때 또 저지를 수 있다 — 그때마다 프로젝트 전체를 다시 검색해야 한다.
(8/10) 데이터소스를 종합 정리하고, 한국 지표를 채우다
#데이터소스 정리#API 검증#이중화
그동안 조사한 출처를 한 문서로 종합 정리했다. 거시경제 대시보드가 미국 지표뿐이던 걸, 한국은행(ECOS) 통계표코드를 문서 대신 조회용 API로 직접 검증하며 10개 연결했다.
"정부부채"처럼 ECOS에 없는 지표는 새로 찾아 연결했다.
같은 날 자산현황 대시보드를 처음부터 두 출처로 이중화해서 새로 만들었다. 그런데 이날도 "또 자동 업데이트가 안 됐다"는 걸 발견했고, 완전히 다른 유형의 원인 4가지(AI 응답이 약속한 형식을 벗어남, 라이브러리가 자체적으로 건다는 타임아웃을 믿었는데 안 먹힘, 워크플로 4개가 늘며 생긴 git push 충돌, UTC 계산 때문에 한국 사용자 눈엔 날짜가 하루 밀려 보이는 문제)를 또 찾아 고쳤다.
💬 재사용 프롬프트
"이 API에서 [지표명]을 가져오고 싶은데, 공식 문서에 정확한 코드가 없어. 비슷한 API(목록·항목 조회용 엔드포인트)가 있으면 그걸로 먼저 항목을 확인하고, 그다음에 실제 데이터를 가져와줘."
ECOS의 월간 코스피 값이 실제보다 훨씬 높게 나온 이상 현상도, 이 방식으로 "이 테이블이 얼마나 자주 갱신되는지"까지 검증해서 잡았다(일별 테이블로 교체).
(8/11) 워크플로가 여러 개로 늘며 생긴 문제, 그리고 마무리
#동시성 이슈#시간대 처리#마무리
워크플로 4개가 서로 부딪히는 문제 두 가지를 정리했다 — 예약 시각이 겹쳐서 push가 거절되는 문제(git pull --rebase 추가 + 시각 분산)와, "오늘" 날짜를 UTC로 계산해서 한국 사용자에겐 하루 늦어 보이던 문제(KST 고정 오프셋 변환).
AI가 스키마를 지키겠다고 약속해도 완벽히 지키지 않을 수 있다는 걸 다시 한번 겪고, Array.isArray() 같은 명시적 타입 검증으로 방어하는 습관도 정리했다.
화면에 남아있던 마지막 UTC 표시까지 KST로 시간 표시방식을 통일하고, 2주차를 여기서 공식적으로 마무리했다. 원래 계획했던 "반도체 생태계 구조도"는 못 만들었지만, 대신 계획엔 없던 반도체 종목 대시보드·자산현황 대시보드가 통째로 추가됐다 — 구조도는 3주차 초반으로 이월하기로 정리했다.
2. 자동화 장애 원인 분석
8/4~8/11 사이 "매일 자동 업데이트가 안 돼요"를 몇 번이나 겪으며 찾아낸 원인을 모아보면, 층위가 매번 완전히 달랐다.
외부 API 응답
❗ Gemini 503, SIA 403, 관세청 접속 차단
✓ 재시도 유틸(지수백오프) + 부분 실패해도 이전 값 유지
내가 짠 코드
❗ 새로 추가한 fetch에 타임아웃 깜빡함 (반복)
✓ 발견 즉시 프로젝트 전체 검색해 전수 수정
외부 데이터 신선도
❗ 죽은 RSS 피드 (2020년·2025년 고정)
✓ 새 출처 추가 시 인코딩·날짜·최신성 체크리스트화
라이브러리 신뢰
❗ rss-parser의 내장 타임아웃이 일부 상황엔 안 먹힘
✓ 25개 피드 전부 수동 타임아웃 방식으로 통일
공유 자원 동시쓰기
❗ 워크플로 4개가 같은 시각에 push하며 충돌
✓ git pull --rebase + 예약시각 분산
시간대 계산
❗ UTC 기준 "오늘"이 한국 기준으론 하루 전
✓ KST 고정 오프셋(UTC+9) 유틸로 통일
AI 응답 형식
❗ Gemini가 약속한 JSON 스키마를 살짝 벗어남
✓ Array.isArray() 등 명시적 타입 검증
이번 주 제일 큰 깨달음 — "고쳤다"는 그 순간의 원인 하나를 없앤 것일 뿐, "다시는 안 멈춘다"는 뜻이 아니었다. 전혀 다른 층위에서 계속 새 원인이 나올 수 있다는 걸 받아들이고, 매번 실행 기록을 직접 확인하는 습관이 자동화를 늘릴수록 더 중요해졌다.
3. 바이브 코딩 회고
1주차에 비해, 막연히 구상했던 내용을 조금씩 구조를 잡아가고 발전시키는 시간이었다. 의미 있는 건 전과 후로 확연히 AI를 활용한 바이브 코딩에 대한 이해도가 높아진 시간이었기 때문이다.
계획은 만들면서 다시 짜도 된다
"1년치만 보여줄까"를 멈추고 재검토한 것처럼, 실제로 만들어보고 나서 계획을 고치는 게 자연스럽다.
"고쳤다" ≠ "완전히 안정화됐다"
같은 자동화가 몇 번이나 다른 이유로 멈췄다. 층위가 다르면 원인도 다르다는 전제로 접근해야 한다.
AI·외부 데이터는 항상 방어적으로 다룬다
RSS 피드도, LLM 응답 스키마도, 공공 API 문서도 "약속대로 온다"고 믿지 말고 코드에서 검증한다.
재사용 프롬프트 2개
"AI에게 링크 대신 id로 참조시키기"와 "메타 API로 먼저 항목 확인하고 실제 데이터 가져오기"는 이후에도 계속 유용했다.
재사용 진단 명령어
gh run list --workflow=<파일> --json event,createdAt --jq '.[] | select(.event=="schedule")' 로 예약 실행이 진짜 멈췄는지, 늦게 도는 건지 데이터로 구분할 수 있다.
🚀 다음 주 계획
차주에는 좀 더 뾰족하게, 깊이 있게 바이브 코딩 작업을 해보려 한다. 시작할 때 구상했던 것들이 실효성 있는 결과물로 이어지도록 만드는 게 목표다.
이번 주 자료
📋 계획
반도체 대시보드 설계 확정
📘 개념 1 (프로젝트)
데이터 소스 종합 정리 / API 호출엔 왜 타임아웃을 걸어야 하나 / RSS 피드는 표준이 아니다 / 출처와 내용 구분하기부분 실패해도 데이터가 안 날아가게 / GitHub Actions 예약 실행이 늦게 도는 이유 / 공공데이터 API, 문서 대신 직접 검증하기 / 자동화가 여러 개로 늘어나면 생기는 문제
📗 개념 2 (AI 공통)
Claude Code 구독과 API 과금은 다른 지갑 / 환경변수 이름은 대소문자를 구분한다 / API 키 유출 방지 원칙 / AI가 정해준 스키마도 완벽히 안 지켜질 수 있다
📎 세부사례 7편