Gemini 무료 티어와의 사투 — 모델 3종 실측하고 타임존 버그까지
Gemini 3 계열이 전부 429
Google AI Studio 쿼터 화면에서 확인하니 Gemini 3 계열은 무료 티어에서 Search Grounding 일일 할당량이 0이었다. 2.5-flash로 바꿨다가, 검증 도중 2.5가 단종 진행 중(404)인 걸 확인해서 3.5-flash로 다시 바꿨다. 결국 3.7/2.5/3.5 세 버전을 전부 실측했다 — 3.7은 429, 2.5는 404(단종), 3.5만 살아있었다. Gemini 3 계열은 세부 버전과 무관하게 검색 그라운딩 무료 할당량이 0이라는 결론.
타임존 버그 — "오늘"이 하루 전으로 계산되고 있었다
Gemini 모델 문제를 검증하던 중 실측으로 발견한 버그. @Scheduled cron 자체는 Asia/Seoul 기준 08:00에 정확히 실행되지만, 그 안의 LocalDate.now()는 타임존을 명시하지 않아 컨테이너 기본값(UTC)을 쓰고 있었다. KST 08:00은 UTC로 전날 23:00이라, 매일 자동 실행마다 "오늘" 날짜가 하루 전으로 계산돼 "이미 존재함"으로 오판하고 스킵할 위험이 있었다. 브리핑 조회 API(latest/list)도 같은 패턴의 버그를 갖고 있어서 함께 고쳤다.
수출입은행 API가 항상 빈 응답
수출입은행 환율 API는 "영업일 11시 이전에 당일 데이터 요청 시 null 반환"이 정책인데, 스케줄러는 매일 08:00 KST(11시 이전)에 도는 구조라 매번 빈 배열만 받고 있었다. 전일부터 거꾸로 조회해서 데이터가 있는 가장 최근 영업일을 찾도록 바꿨다(주말·공휴일 연속 대비 최대 7일 소급).
감사로그가 엉뚱한 곳에 찍힌다
SchedulerJob이 Gemini 실패 후 자기 자신을 FALLBACK으로 표시하려던 게, 그 뒤에 실행되는 아무 감사 대상 호출(FCM_PUSH, 나중엔 NEWS_API)에나 먼저 소비되고 있었다. 프로덕션 감사로그에서 NEWS_API가 "Gemini 실패..." 사유로 잘못 찍힌 걸 보고 발견했다 — 호출 깊이를 추적해 가장 바깥쪽 호출만 소비하도록 고치고 재현 테스트를 추가했다.
Search Grounding을 아예 뺐다
무료 티어에서 막힌 건 Search Grounding 도구의 할당량이지 generateContent 자체가 아니라는 데 착안했다. 이미 Yahoo·수출입은행 시세와 RSS 뉴스로 실제 데이터를 확보하고 있어서 Gemini가 직접 검색할 필요가 없었다 — tools 필드를 빼고 시세+뉴스를 프롬프트에 직접 넣어 요약·종목추천만 시키는 쪽으로 바꿨다. 뉴스 소스도 네이버 검색 API(API HUB 이전으로 신규 신청이 막힘) 대신 회원가입이 필요 없는 아시아경제 증권 RSS로 정리했다.
하루 요약
$0 제약을 지키면서 안정적으로 돌아가는 조합을 찾기까지 모델 3종 실측과 버그 4건을 하루 만에 처리했다.