
어휘력 향상 봇 강화하기: Google Sheets 영속성 및 개선된 로그 구현
요약
Gemini 2.5 Flash 기반 텔레그램 봇에 Google Sheets를 데이터베이스로 통합하여 데이터 영속성을 확보하고 AI 토큰 비용을 절감하는 방법을 다룹니다. Google Apps Script를 활용한 데이터 조회/저장 계층 구현과 운영 로그 추적기 구축 과정을 설명합니다.
핵심 포인트
- Google Sheets를 활용한 데이터베이스 구현으로 단기 기억 문제 해결
- 기존 데이터 조회 로직을 통해 불필요한 AI 토큰 소모 방지
- Google Apps Script와 GCP 프로젝트 설정을 통한 안정적인 런타임 환경 구축
- 운영 로그 추적기를 통한 시스템 모니터링 자동화
지난 게시물에서 우리는 원시적인 어휘 단어를 아름다운 학습 카드로 변환하는, Gemini 2.5 Flash 기반의 비공개 Telegram 봇을 구축했습니다. 우리는 Google Apps Script를 완전히 기능하는 비용 제로 클라우드 엔드포인트로 만들었습니다. 이 설정을 놓쳤다면 여기에서 따라잡을 수 있습니다.
현재 우리의 봇은 대화 능력이 뛰어나지만, 단기 기억 상실 문제가 있습니다. 채팅 기록을 지우는 순간, 당신의 어휘들은 사라집니다. 게다가, 단어를 보낼 때마다 'AI 토큰 세금'을 내야 합니다. 하루에 같은 단어를 정확히 세 번 찾아보더라도 말이죠.
오늘은 이 두 가지 문제를 모두 해결할 것입니다. 우리는 봇을 확장하여 먼저 Google Sheet 데이터베이스를 자동으로 확인하도록 하여 AI 토큰 사용을 절약하고, 새로운 어휘를 영구적으로 저장하며, 자동화된 운영 로그 추적기를 구축할 것입니다. 그 과정에서 Google Cloud Platform (GCP)이 내부적으로 스크립트의 아키텍처를 어떻게 처리하는지—그리고 사용자 지정 GCP 프로젝트 설정이 왜 조용한 런타임 충돌을 해결하는지—에 대한 커튼 뒤 이야기를 파헤쳐 볼 것입니다.

최적화된 시스템의 업데이트된 청사진은 다음과 같습니다:
[ Telegram Webhook Request ]
│
▼
...
파트 1: 코드 업그레이드
우리는 sheet.gs에 완전히 새로운 조회 및 저장 계층을 추가하고, AI 토큰을 소모하기 전에
두 번째 탭을 하단에 만들고 이름을 **Logs**로 지정하세요. 이것이 우리의 사적인 프로덕션 터미널 창 역할을 할 것입니다.
이제 브라우저의 URL 표시줄에서 고유한 스프레드시트 ID를 가져오세요 (/d/와 /edit 사이에 있는 긴 문자 및 숫자열입니다).

Apps Script의 프로젝트 설정(Project Settings) (톱니바퀴 아이콘)으로 이동하여, **스크립트 속성(Script Properties)**까지 스크롤하고 다음을 추가하세요:
SPREADSHEET_ID➔ (복사한 스프레드시트 ID 문자열)
2. 코드 파일 업데이트하기
작업 공간 편집기를 여세요. telegram.gs와 gemini.gs 코드는 그대로 두세요. 아래 Gist 링크로 이동하여 나머지 파일을 업데이트하세요:
sheet.gs생성: Gist에서 데이터베이스 쿼리 로직을 복사하세요. 이것은 A열을 검색하여 일치하는 레코드를 찾고, 데이터 프레임을 캐싱하며, 실행 로그를 관리합니다.main.gs업데이트: 기존의 메인 함수를 새로운 최적화된 스크립트 블록으로 덮어쓰세요. 이것은 트래픽을 동적으로 라우팅합니다—구글 시트에서 저장된 항목을 즉시 로드하거나, 완전히 새로운 단어가 나타날 때 Gemini에 질의하는 방식입니다.
저희는 코드를 모듈화하고 깔끔하게 유지하고 있습니다. 오늘 작업할 모든 원본 파일은 업데이트되어 Gist에서 사용할 수 있습니다:
🔗 GitHub Gist에서 전체 업데이트된 소스 파일 받기
아키텍처 업데이트가 적용되도록 배포 관리자 드롭다운 창에서 **새 버전(New Version)**을 반드시 배포하세요!
파트 2: 보이지 않는 프로덕션 충돌 (그리고 로그가 누락되는 이유)
이 코드를 복사하고 새 버전을 배포한 후, Apps Script 세계의 좌절스러운 통과 의례를 만날 수 있습니다. 바로 **편집기 내에서
설상가상으로, Apps Script 대시보드를 확인해 보면 실패한 프로덕션 실행(production executions) 옆의 "Cloud Logs" 옵션이 회색으로 비활성화되어 있거나 완전히 비활성화되어 있습니다.
도대체 왜 그럴까요?
기본적으로 모든 Apps Script는 Google이 완전히 관리하는 숨겨진, 마이크로 범위(micro-scoped)의 백그라운드 GCP 프로젝트에서 실행됩니다. 사용자가 해당 백그라운드 컨테이너를 소유하지 않기 때문에, Google은 사용자의 관리자 로깅 권한(administrative logging privileges)을 박탈합니다. 익명의 웹훅(webhook)이 Telegram을 통해 실행될 때, 이는 낮은 우선순위의 인프라에서 실행됩니다. 만약 처리 용량(processing breath)이 바닥나면 실행 도중에 중단되며, 캐시된 스프레드시트 쓰기(appendRow) 작업은 허공으로 사라져 버립니다.
파트 3: GCP 아키텍처 설명 (쉽게)
우리의 봇을 무결하게(bulletproof) 만들기 위해서는, 봇을 우리 자신의 Standard GCP Project에 연결하고 OAuth 동의 화면(OAuth Consent Screen)을 구성해야 합니다. 이것이 정확히 무엇을 의미하는지 자세히 살펴보겠습니다.
Google Cloud Project를 당신이 소유한 안전한 **디지털 오피스 빌딩(Digital Office Building)**이라고 생각해보세요. 이 빌딩 안에서는 서로 다른 전문 부서들이 함께 협력하여 일합니다.
우리의 봇이 당신의 커스텀 GCP 프로젝트 빌딩 내부에서 실행될 때, 흐름은 완전히 바뀝니다:
- 정문 (Telegram Webhook): Telegram이 당신의
doPostURL 엔드포인트(endpoint)를 호출합니다. - 보안 데스크 (OAuth 동의 화면 (OAuth Consent Screen)): 당신이 OAuth 프로필을 설정했기 때문에, 스크립트는 더 이상 익명의 인터넷 낯선 사람으로서 실행되지 않습니다. 스크립트는 검증된 디지털 보안 배지를 보유하게 됩니다. 이는 **암시적 범위 (Implicit Scopes)**를 통해 원활하게 권한을 상속받습니다. 즉, Apps Script가 코드를 사전 스캔하여 당신이 Sheets를 사용하고 있음을 인지하고, 당신을 대신하여 스프레드시트 파일에 읽기/쓰기를 할 수 있도록 당신의 배지에 자동으로 권한을 부여했다는 의미입니다.
- 우선순위 실행 (High-Priority Execution): 당신이 건물의 소유주이기 때문에, Google은 전용 고우선순위 처리 런타임(runtime)을 할당합니다. 당신의 스크립트는 시트 캐시(sheet cache)를 안전하게 확인하고, 필요 시 Gemini와 통신하며, 데이터를 스프레드시트 그리드에 직접 입력하는 데 필요한 서버 대역폭을 확보합니다.
- 보안 카메라 (Cloud Logging Explorer): 모든 print 문과 에러 스택 트레이스(error stack trace)가 카메라에 영구적으로 포착됩니다. 당신이 건물의 관리자이므로, 언제든지 Log Explorer 대시보드를 열어 운영 동작을 검토할 수 있습니다.
4단계: 스크립트를 GCP 프로젝트에 연결하기
봇을 프로덕션 수준(production-grade)으로 만들 준비가 되셨나요? 다음 단계를 따르세요:
- Google Cloud Console로 이동하여 새 프로젝트를 생성합니다.
- 상단 바에서 OAuth Consent Screen을 검색하고, 사용자 유형(User Type)을 External로 설정한 뒤, 기본 앱 이름과 이메일을 입력합니다 (범위(scopes)는 완전히 비워두어도 됩니다. 배포 시 Apps Script의 암시적 범위가 이를 처리할 것입니다!).
- GCP 대시보드의 Project Settings로 이동하여 Project Number를 복사합니다.
- Apps Script 에디터로 돌아와 톱니바퀴 아이콘(Project Settings)을 클릭하고, Change project를 클릭한 뒤 복사한 Project Number를 붙여넣습니다.
- Apps Script 프로젝트 설정(Project Settings)에 있는 동안, **"Log uncaught exceptions to Cloud Operations"**라고 표시된 체크박스가 선택되어 있는지 확인하세요.
마지막으로 웹 앱(Web App)의 **새 버전(New Version)**을 배포합니다 (Deploy > Manage Deployments > Edit > New Version > Deploy).
결론
다시 Telegram으로 돌아가서 이미 찾아본 적이 있는 단어를 봇에게 보내보세요. 봇은 적절한 마커와 함께 거의 즉시 답장을 보낼 것입니다.
완전히 새로운 단어를 보내면, 해당 단어가 Vocabulary 스프레드시트에 실시간으로 입력되는 것을 볼 수 있으며, Logs 탭에는 실행 확인 플래그가 깔끔하게 찍히는 것을 확인할 수 있습니다.
이제 여러분은 API 크레딧을 낭비하지 않으면서 평생 학습 데이터베이스를 추적할 수 있는, 믿을 수 없을 정도로 최적화된 AI 기반 어휘 엔진을 갖게 되었습니다.
토큰 절약 시트 통합이 완벽하게 작동한다면 아래에 댓글을 남겨주세요. 즐거운 해킹 되시길 바랍니다! 🚀
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
