이전 글: 7편 — Docker Compose로 4개 컨테이너 운영하기
다음 글: (시리즈 완결)
파이프라인은 얼마나 잘 돌아갔나
3개월, 약 65 거래일 동안 파이프라인을 운영했다.
전체 성공률은 87%였다. 13번 실패했다.
| 실패 원인 | 횟수 | 비율 |
|---|---|---|
| Gemini Rate Limit 초과 | 5회 | 38% |
| Yahoo Finance RSS 응답 없음 | 4회 | 31% |
| DALL·E 이미지 생성 실패 | 2회 | 15% |
| Notion API 타임아웃 | 2회 | 15% |
Gemini Rate Limit이 가장 많다.
보유 종목이 늘면서 정제 대상 뉴스 수가 증가했고, 3초 대기로는 버티지 못하는 날이 생겼다.
간격을 5초로 늘려서 이후로는 같은 원인의 실패가 없었다.
Yahoo Finance RSS 응답 없음은 외부 서비스 문제라 대응 방법이 제한적이다.
현재는 실패 시 Telegram으로 알림을 받고 수동으로 재실행하는 방식으로 처리하고 있다.

가장 잘 된 것
Telegram 알림이 운영 방식 자체를 바꿨다.
이전에는 아침에 Notion을 직접 열어야 파이프라인 성공 여부를 알 수 있었다.
지금은 알림이 안 오면 바로 로그를 확인한다.
실제로 두 번 Gemini 장애를 조기에 발견해서 데이터를 살렸다.
운영 시스템에 Telegram 알림 하나가 없는 것과 있는 것의 차이가 이 정도다.
예측 정확도 평가 데이터가 쌓이면서 패턴이 보이기 시작했다.
AI 분석을 무조건 따르는 게 아니라,
어떤 상황에서 신뢰할 수 있는지를 데이터로 확인하게 됐다.
시장 전체 상승일에는 BUY 적중률이 높고,
시장 하락일에는 HOLD 판단이 가장 안정적이다.
개월치 데이터 기준 전체 HIT율은 67%
→ 이 수치 자체보다 "어떤 판단을 믿을 것인가"의 기준이 생겼다는 게 더 가치 있다.
→ 예측 정확도 차트는 5편에서 확인할 수 있다.
남아 있는 기술 부채
솔직하게 정리하면 네 가지다.
accountNo=3 하드코딩
BlogService, BalanceService 등 여러 곳에 계좌 번호가 직접 박혀 있다.
지금은 나 혼자 쓰는 시스템이라 문제가 없지만, 계좌를 추가하거나 다른 사람이 쓰려면 코드 전반을 수정해야 한다.
Thread.sleep() 기반 Rate Limit 처리
API 호출마다 Thread를 블로킹한다. 종목이 늘수록 파이프라인 전체 실행 시간이 선형으로 증가한다.
비동기 처리로 전환하면 대기 시간 동안 다른 종목을 병렬로 처리할 수 있다.
현재 30~40분짜리 파이프라인을 10분 이내로 줄일 수 있을 것으로 예상한다.
Refresh Token 자동 갱신 미구현
프론트엔드에서 401 응답 시 로그인 페이지로 리다이렉트만 한다.
Access Token이 1시간마다 만료되어 하루에 여러 번 다시 로그인해야 한다.
Axios 인터셉터에서 자동 갱신하는 로직은 구현 범위에 넣어놨는데 아직 미완이다.
파이프라인 순서 보장 없음
현재는 스케줄 간격으로 해결하고 있지만, 종목이 30개를 넘으면 시간 버퍼가 부족해진다.
Spring Batch Job 체인 전환은 언제가 됐든 해야 할 작업이다.

마치며
이 시리즈를 쓰면서 가장 많이 느낀 것은, 개인 프로젝트는 완성이 목표가 아니라는 것이다.
실제로 매일 돌아가는 시스템을 운영하면서 문제를 발견하고, 고치고, 다음 개선 사항을 생각하는 과정이 계속된다.
코드를 짜는 것보다 운영하면서 배운 것이 더 많았다.
몇 가지를 정리하면 이렇다.
- AI 응답은 항상 정제 코드가 필요하다. 같은 프롬프트에도 출력 형식이 달라진다
- Telegram 알림 하나가 운영의 질을 바꾼다. 조용히 실패하는 시스템은 통제할 수 없다
- 외부 API는 언제든 예상 밖으로 동작한다. FRED의 ".", Yahoo의 시차, Gemini의 Rate Limit
- 기술 부채는 쌓이는 것보다 목록화가 먼저다. 어디에 문제가 있는지 알아야 우선순위를 정할 수 있다
이 글을 읽는 누군가에게 가장 좋은 조언을 하나 고르라면 이것이다.
일단 만들어서 실제로 돌려봐라.
설계는 돌아가는 시스템 앞에서 항상 수정된다.
시리즈 전체 목록
| 편 | 제목 |
|---|---|
| 1편 | 왜 만들었고, 어떻게 설계했나 |
| 2편 | Spring Boot + MyBatis + JWT 백엔드 설계 |
| 3편 | 매일 새벽 자동으로 돌아가는 파이프라인 설계 |
| 4편 | 7개 외부 API를 어떻게 연결했나 |
| 5편 | Gemini + GPT + Claude 분업으로 투자 분석하기 |
| 6편 | Claude로 블로그 초안 자동 생성 + Notion 동기화 |
| 7편 | Docker Compose로 4개 컨테이너 운영하기 |
| 8편 | 3개월 운영 후기 — 잘 된 것, 실패한 것, 다음 목표 (현재 글) |