토이 프로젝트 서버비 월 5만 원, 코드 하나로 0원 만든 날
운영 중인 뉴스레터 큐레이션 사이트가 슬슬 트래픽을 타기 시작했다. 해외 아티클 50여 개를 매일 크롤링하고, AI로 요약과 태그를 자동으로 붙이는 봇이 뼈대였다. 그런데 어느 달 OpenAI API 청구서를 열어보니 40달러를 훌쩍 넘겼다. 수익은 한 푼도 없는 프로젝트에 매달 5만 원 넘는 유지비는 솔직히 뼈아팠다.
API 호출을 아예 끊어버릴까 고민하던 차에, 구글의 Gemini API 무료 티어(Free Tier)가 파격적인 조건을 제공한다는 글을 발견했다. “설마 무료가 내 무거운 프롬프트를 버텨줄까?” 반신반의하면서도 주말 이틀을 공식 문서에 쏟아붓고 프로젝트 코드를 전면 마이그레이션했다. 한 달을 극한으로 굴린 결과 — 성능, 한계, 그리고 밤새 마주친 에러까지 전부 꺼내놓는다.
1. 테스트 환경 및 사전 준비
기존 파이썬 스크립트와 호환성을 맞추기 위해 복잡한 프레임워크 없이 구글 공식 SDK만 사용했다. 파이썬 기초만 있으면 아래 환경을 그대로 복제할 수 있다.
- 운영체제: Windows 11 Pro, M2 MacBook Air (크로스 플랫폼 테스트 완료)
- Python 버전: 3.12.2
- 코드 편집기: VS Code
- 핵심 패키지:
google-generativeai(0.5.0 이상),python-dotenv - 테스트 모델:
gemini-1.5-flash(빠른 응답),gemini-1.5-pro(대용량 컨텍스트·복잡한 추론)
모델 선택 기준은 단순하다. 짧은 뉴스 요약처럼 빠른 처리가 우선이면 Flash, 100페이지 넘는 PDF를 통째로 분석해야 하면 Pro. 둘 다 무료 티어 범위 안에서 쓸 수 있다는 게 핵심이다.
2. JSON 구조화 출력 파이프라인 무과금으로 구축하기
1단계: Google AI Studio에서 API 키 발급
구글 클라우드 콘솔의 복잡한 결제 연동 없이, Google AI Studio(aistudio.google.com)에 구글 계정으로 로그인하면 즉시 API 키를 발급받는다. [Get API key] 버튼을 누르고 새 프로젝트에서 키를 생성한 뒤 복사해 둔다. 결제 카드를 등록하지 않아도 바로 시작할 수 있다는 점이 OpenAI와 가장 다른 부분이다.
2단계: 라이브러리 설치 및 환경변수 설정
터미널을 열고 공식 SDK를 설치한다. 환경변수 파일에 키를 저장할 때는 따옴표를 절대 붙이지 않는다 — 이 실수로 나중에 403 에러를 만났다.
pip install google-generativeai python-dotenv
GEMINI_API_KEY=AIzaSy...여기에_발급받은_키_입력
3단계: DB에 바로 꽂히는 JSON 출력 실전 코드
단순 텍스트 요약이 아니라 데이터베이스에 직접 넣을 수 있는 구조화된 JSON을 뽑는 코드다. response_mime_type 옵션을 쓰자 파싱 에러가 완전히 사라졌다.
import os
import time
import google.generativeai as genai
from dotenv import load_dotenv
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
def extract_insights_to_json(long_article):
model = genai.GenerativeModel(
model_name='gemini-1.5-flash',
generation_config={
"response_mime_type": "application/json",
"temperature": 0.2
}
)
prompt = f"""
당신은 전문 데이터 분석가입니다. 아래 아티클을 분석해
다음 JSON 스키마를 엄격히 준수하여 출력하세요.
{{
"title": "기사 핵심을 나타내는 창의적인 제목",
"keywords": ["키워드1", "키워드2", "키워드3"],
"summary": "3문장 이내 명확한 요약",
"sentiment": "긍정, 부정, 중립 중 택 1"
}}
[아티클 본문]:
{long_article}
"""
response = model.generate_content(prompt)
return response.text
if __name__ == "__main__":
sample = "AI 기술 발전으로 클라우드 인프라 비용이 급증하고 있다. 많은 스타트업이 무료 API 티어로 눈을 돌리는 추세다."
try:
result = extract_insights_to_json(sample)
print(result)
time.sleep(4.2) # 무료 티어 RPM 제한 대응 필수
except Exception as e:
print(f"API 호출 실패: {e}")
⚠ 무료 티어 데이터 프라이버시 — 반드시 확인할 것
공식 문서를 읽다가 발견한 가장 중요한 조항이다. Gemini API 무료 티어를 사용하면 입력한 프롬프트와 데이터가 구글의 AI 모델 학습에 활용될 수 있다. 공개된 뉴스 요약이나 퍼블릭 데이터 분석에는 전혀 문제없지만, 고객 개인정보나 사내 기밀문서를 넣는 건 절대 안 된다. 그 경우엔 결제 수단을 등록하고 종량제(Pay-as-you-go)로 전환해야 데이터 학습을 차단할 수 있다.
3. 밤새 마주친 치명적 에러 2가지와 해결 과정
에러 ① 429 ResourceExhausted — 분당 15회 제한의 벽
기사 50개를 for문으로 딜레이 없이 쏘았더니 딱 16번째에서 멈췄다. 대시보드를 확인해보니 무료 티어는 분당 15회(15 RPM)라는 엄격한 호출 제한이 걸려 있었다. 해결법은 단순했다. 호출마다 time.sleep(4.2)를 강제로 넣었다. 60초 ÷ 14회 = 약 4.2초. 거기에 에러 발생 시 지수 백오프(Exponential Backoff) 방식으로 대기 후 재시도하는 로직을 추가하니, 50개가 중간에 끊기지 않고 전부 처리됐다. 위 코드에 이미 time.sleep(4.2)가 포함된 이유가 바로 이것이다.
에러 ② JSON 파싱 불가 — 마크다운 블록이 껴드는 함정
response_mime_type 옵션을 몰랐던 초기에는 프롬프트에 “반드시 JSON으로 줘”라고 적었다. 그런데 Gemini는 굳이 앞에 ```json 마크다운 블록을 붙여서 응답했다. json.loads()가 그 문자열을 파싱하지 못하고 계속 에러를 냈다. 정규표현식으로 마크다운을 걷어내는 지저분한 코드를 짜다가, SDK가 지원하는 구조화 출력 옵션을 발견했다. generation_config에 "response_mime_type": "application/json" 한 줄을 추가하자 에러율이 0%가 됐다. 코드도 절반으로 줄었다.
4. 한 달 운영 후 확인한 실제 수치 변화
모든 에러를 잡고 약 한 달간 Gemini API로 완전히 마이그레이션한 결과는 숫자가 말해줬다.
- 비용: 매달 40달러(약 5만 5천 원)씩 나가던 OpenAI API 비용이 정확히 0원으로 감소. 하루 최대 1,500회 호출 한도는 개인 프로젝트 수준에서 남아돌았다
- 대용량 처리: 100페이지 넘는 영문 PDF 매뉴얼을 분석할 때 기존엔 텍스트를 수십 조각으로 쪼개야 했다. Gemini 1.5 Pro의 100만 토큰 컨텍스트를 쓰니 30만 토큰 분량을 자르지 않고 한 번에 던져 25초 만에 핵심 요약본이 나왔다
- 응답 속도:
gemini-1.5-flash기준 평균 응답 시간 1.2초 내외. 기존 대비 체감 약 30% 빨랐다
5. 이 무료 티어가 어울리는 프로젝트와 아닌 것
한 달 극한 테스트가 남긴 판단 기준은 명확하다.
- 강력 추천: 수익 없는 대학생 졸업작품, 1인 개발자 사이드 프로젝트, 퍼블릭 뉴스·논문을 백그라운드에서 느긋하게 분석하는 연구자. 비용 걱정 없이 여유있는 토큰 뇌를 공짜로 쓸 수 있다는 건 엄청난 무기다
- 비추천: 사용자 응답을 1초 이내로 실시간 처리해야 하는 상용 서비스나 B2B 챗봇. 분당 15회 제한은 그런 환경에서 치명적이다. 처음부터 유료 종량제로 결제 수단을 연동하는 것이 맞다
- 절대 사용 금지: 고객 개인정보, 사내 기밀문서, 미공개 재무 데이터가 담긴 텍스트 처리. 무료 티어는 데이터 학습에 활용될 수 있으므로 이 경우 반드시 유료 플랜으로 전환해야 한다
마이그레이션 전날까지만 해도 “무료가 이걸 버텨줄 수 있을까” 의심했다. 지금은 그 의심이 민망하다. time.sleep(4.2) 한 줄과 response_mime_type 옵션 하나만 챙기면, 무료로 운영 가능한 꽤 쓸 만한 AI 파이프라인이 완성된다.