토이 프로젝트 서버비 월 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를 설치할 때, 환경변수에 API 키를 입력하는 방식을 꼼꼼히 확인하지 않으면 낭패를 본다. 저는 따옴표를 붙여서 저장했다가 403 에러를 맞았다. 이 부분은 문서에 명확히 경고가 없어서 헷갈렸는데, 키를 그냥 문자열 그대로 넣어야 정상 작동한다.
pip install google-generativeai python-dotenv
GEMINI_API_KEY=AIzaSy...여기에_발급받은_키_입력
3단계: DB에 바로 꽂히는 JSON 출력 실전 코드
단순한 텍스트 요약 말고, 바로 데이터베이스에 넣을 수 있는 구조화된 JSON을 뽑아내는 코드를 짜는 게 핵심이었다. 특히 response_mime_type 옵션을 지정하면서 파싱 에러가 거의 사라진 점은 인상 깊었다. 이거 없이 그냥 쓰면 JSON 파싱이 엉망이라 시간 엄청 잡아먹는다.
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 API가 응답에 ```json 마크다운 블록을 붙여서 보내더라. 이 때문에 json.loads()가 파싱을 못 하고 계속 에러를 뿜었다. 저는 정규표현식으로 마크다운 블록을 제거하는 지저분한 코드를 직접 짰는데, 코드가 너무 복잡해지고 유지보수가 힘들었다. 그러다 SDK에서 generation_config에 "response_mime_type": "application/json" 옵션을 지원한다는 걸 알았다. 이 옵션을 넣은 뒤에는 에러가 완전히 사라졌고, 코드도 절반 가까이 줄었다. 초반에 이걸 몰라서 시간 낭비한 게 아쉬웠다.
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 파이프라인을 무료로 운영할 수 있다는 사실에 놀랐다. 다만 모바일 환경에서는 메뉴가 꼬이는 현상이 있어 이 부분은 조금 번거로웠다.