알림 봇 제작 가이드: 비용 절감과 AI 비서 활용법

PC가 꺼지면 조용해지는 AI 비서 대신, 알림 봇 '노티'와 '포스티'를 만든 이야기

## 소개

기존에는 오픈소스 AI 비서 프로그램에 캐릭터를 입혀 집 PC에서 텔레그램으로 대화하며 사용하고 있었습니다. 하지만 쓰다 보니 두 가지 아쉬운 점이 있었습니다.

1. 가용성의 한계: PC가 켜져 있을 때만 대답하는데, 24시간 켜 둘 장비가 없었습니다.

2. 비용 부담: 실제 쓰는 양에 비해 API 비용이 너무 많이 드는 것 같았습니다.

그래서 AI 코딩 도구(Claude Code)의 도움을 받아 "더 싸게, 더 오래 쓰는 법"을 찾아 나섰습니다. 일주일쯤 지나자 두 개의 가벼운 텔레그램 봇이 탄생했습니다.

- 노티: 메모와 알람 담당

- 포스티: 공부 카드 전송 담당

이 글은 그 제작 과정을 순서대로 정리한 기록입니다.

준비 조건

- 텔레그램 계정: 봇은 텔레그램의 BotFather를 통해 생성했습니다.

- 노션 (Notion): 메모 저장소이자 공부 자료가 담긴 데이터베이스로 활용했습니다.

- Vercel: 과거 봇 제작 경험을 살려 서버리스 배포용으로 사용했습니다.

- Gemini API 키: 과금 걱정 없는 무료 등급 키를 활용했습니다.

- cron-job.org: 특정 시각마다 주소를 호출해 주는 무료 예약 서비스를 썼습니다.

- AI 코딩 도구: 코드 작성부터 테스트, 진행 기록까지 전담시켰습니다.

계정 생성, 토큰 발급, 결제 관련 작업은 직접 처리했고, AI에게는 방법과 명령어만 안내받았습니다. 보안을 위해 비밀값은 로컬 PC 설정 파일에만 저장하고, 채팅창에는 절대 입력하지 않았습니다.

진행 방법

1. 막연한 느낌 대신 '숫자'로 비용 팩트 체크하기

처음엔 "다음 스케줄 알려줘"라는 질문 한 번에 3,000원이 나온 줄 알고 깜짝 놀랐습니다. 그래서 AI에게 대화 내용은 보지 말고 사용량 통계만 분석해 달라고 요청했습니다. 확인해 보니 그 3,000원은 5월 한 달 전체 청구액이었습니다. 6~10월은 매달 수십 원 수준이었습니다.

다만 구조적인 낭비 요소는 확실히 있었습니다. API를 한 번 호출할 때마다 다음 내용을 통째로 보내고 있었습니다.

- 약 1.7만 자의 시스템 지시문

- 29개 도구의 설명, 약 5.2만 자

입력이 출력보다 100배 이상 많아, 짧은 질문 하나에도 엄청난 짐을 지워 보내는 셈이었습니다.

안 쓰는 도구들을 끄고 AI의 추론 단계를 낮춘 뒤 텔레그램으로 테스트해 봤습니다. 결과는 이렇습니다.

| 항목 | 전 | 후 |

|---|---|---|

| 도구 수 | 29개 | 15개 |

| 도구 설명 | 5.2만 자 | 3.4만 자 |

| 1회 호출 시 입력 토큰 | 약 1.7만 | 약 1.3만 |

또한 Gemini 앱이나 Claude 같은 구독형 서비스에는 API 사용료가 포함되지 않는다는 사실도 새롭게 알게 되었습니다.

2. 24시간 대화는 'Gem'에게 맡기기

24시간 내내 필요한 기능은 세 가지뿐이었습니다.

- 일정 확인

- 금 시세 및 환율 확인

- 위키백과 검색

이 기능들은 굳이 PC 없이도 가능합니다. 그래서 이미 구독 중인 Gemini 앱에 기존과 같은 캐릭터의 'Gem'을 추가 비용 없이 만들었습니다.

Gem 지침에는 명확한 규칙을 넣었습니다.

- 다음 일정은 오늘~내일만 답하기

- 시세에는 기준 시각과 출처 붙이기

초기 테스트에선 지침을 무시하는 엉뚱한 캐릭터가 튀어나오기도 했습니다. 그래서 지침 최상단에 대원칙을 명시해 해결했습니다.

이 안내가 저장된 정보나 이전 대화보다 우선한다.

3. 먼저 말을 걸지 못하는 Gem, 알림 전담 봇의 탄생

외출 중 PC가 꺼져 있을 때 텔레그램 비서가 답하지 않는 상황을 겪었습니다. Gem은 대화는 가능하지만, 정해진 시간에 먼저 알림을 보내지는 못합니다. 이것이 새로운 봇을 만들게 된 결정적 계기입니다.

초기엔 "텔레그램 → Gemini → 노션, Python 서버리스" 구조를 기획했습니다. 그런데 AI 코딩 도구와 논의한 뒤 아래와 같이 전략을 수정했습니다.

- 새 텔레그램 봇으로 분리: 하나의 봇은 한 곳에서만 메시지를 받을 수 있습니다. 그래서 기존 PC 비서와 수신처를 분리했습니다.

- 익숙한 구조 재사용: Python 대신, 이전 봇에서 다뤄 본 Next.js(TypeScript) + Vercel 조합을 선택했습니다.

- 원문 선 저장, 후 분석: AI 분석이 실패하더라도 원본 메모는 노션에 안전하게 남도록 설계했습니다.

- 개인정보 최소화: 민감한 정보는 배제하고 학습 메모와 개인 할 일 위주로만 활용하기로 했습니다.

모든 기능을 한 번에 쏟아붓지는 않았습니다. 버튼 모양이나 명령어 같은 세부 사항은 진행하면서 단계별로 다듬어 갔습니다.

4. 하루 저녁 만에 끝낸 3단계 배포

1단계 — 메모 저장

텔레그램 메시지를 노션 DB에 '일반 메모'로 즉시 저장하고 답장합니다. 배포 중에 문제가 세 번 있었지만 빠르게 해결했습니다.

- 터미널 키보드 입력 오류

- 토큰 오기입(401 오류)

- 노션 DB ID 중복 기입(400 오류)

2단계 — 시간 알람

메모에 시간이 포함되어 있으면 Gemini가 시각을 추출하고, 예약 서비스(cron-job.org)가 알람을 보냅니다. Vercel의 무료 예약 기능은 하루 1회만 돌기 때문에, 외부 서비스로 1분마다 알람을 확인하도록 구성했습니다.

알람에는 세 개의 버튼을 달아 쉽게 응답할 수 있게 했습니다.

- [✅ 완료]

- [⏰ 시각 정하기]

- [🌙 내일 9시]

3단계 — 아침 리마인드

매일 오전 9시에 리마인드 메시지를 보냅니다. 메시지에는 세 가지가 담깁니다.

- 노션에서 뽑은 공부 카드 2장

- 내 메모 1장

- 최근 7일 안에 완료하지 않은 알람(놓친 일)

약 134쪽의 공부 페이지를 섞어서 하루 2칸씩 진행합니다. 그래서 두 달 남짓이면 저절로 한 바퀴를 돌게 됩니다.

이 세 단계는 10월 10일 하루 저녁에 배포하고 실사용 테스트까지 마쳤습니다. 역할은 이렇게 나눴습니다.

- AI: 코드 작성과 테스트

- 나: 서비스 연결과 실제 동작 확인

5. 실사용하며 다듬어 간 디테일

- 안전한 알람 관리: 알람을 바로 지우는 대신 노션 '완료' 칸에 체크되도록 했고, [↩ 되돌리기] 기능도 추가했습니다. 정리는 노션에서 한꺼번에 합니다.

- 명령어 편의성: /알람, /메모 명령어로 남은 알람과 최근 메모를 바로 조회할 수 있습니다.

- 지우기 버튼: 노션 휴지통으로 옮기도록 해서, 30일 안에는 복구할 수 있게 안전장치를 두었습니다.

- 코드 백업: 비밀값과 토큰이 빠졌는지 꼼꼼히 확인한 뒤, 비공개 GitHub 저장소에 코드를 백업했습니다.

6. 봇의 분리: 노티와 포스티

며칠 써 보니 문제가 생겼습니다. 아침 리마인드 메시지에 공부 카드가 길게 붙어서, 정작 그날 챙겨야 할 메모와 알람이 눈에 띄지 않았습니다. 그래서 역할을 둘로 나누었습니다.

- 노티 (기존 봇 이름 변경): 메모 저장, 알람, 지우기, 목록 조회를 전담합니다. 아침에는 메모 1개와 완료하지 않은 알람만 보내고, 보낼 게 없으면 조용히 넘어갑니다.

- 포스티 (새 봇): 아침에 공부 카드 3장을 보냅니다. /카드 명령어로 바로 받을 수도 있습니다. 엉뚱한 메시지를 보내면 "노티에게 보내 줘"라고 안내합니다.

기존 봇의 아이디는 그대로 두고 이름만 바꾸었습니다. 이미 보낸 알람 메시지의 버튼들이 기존 봇에 묶여 있었기 때문입니다. 아침에는 서버가 공부 카드는 포스티로, 나머지는 노티로 알아서 나눠 보냅니다.

7. 포스티에 /찾기 기능 날개 달기

노션 자체 검색 기능에는 예상치 못한 한계가 있었습니다. 페이지 제목만 찾고 본문은 검색하지 못했습니다. 이를 해결하려고 자체 색인 시스템을 만들었습니다.

- 페이지별 '마지막 수정 시각'과 카드 내용을 Vercel의 비공개 파일 하나에 모아 둡니다.

- 하루 두 번(06:00, 18:00) 바뀐 페이지만 갱신합니다.

- 바로 반영해야 할 때는 /색인 명령어를 씁니다.

| 항목 | 소요 시간 |

|---|---|

| 처음 색인 (134페이지, 603카드) | 149초 |

| 바뀐 게 없을 때 갱신 | 1초 미만 |

| 실제 검색 | 수 밀리초 |

결과와 배운 점

확인된 성과

- 1~3단계 기능은 실사용 테스트를 마치고 자리 잡았습니다.

- 자동화 테스트도 처음 14개에서 94개까지 늘렸습니다.

- 이 모든 시스템을 무료 등급 Gemini 키와 무료 예약 서비스만으로 구축했습니다.

시행착오와 극복 과정

- 시각 계산의 분리: AI에게 시각 계산까지 맡기니 일관성이 크게 떨어졌습니다. 그래서 일을 나눴습니다.

- Gemini: 날짜, 오전/오후 같은 텍스트만 뽑아냅니다.

- 코드: 실제 시각으로 바꾸는 일을 규칙대로 처리합니다.

- 그 결과 같은 글이면 항상 같은 결과가 나옵니다.

- 일시적 오류 방어: API 과부하(503 오류)로 알람이 일반 메모로 저장되는 일을 겪었습니다. 그래서 최대 3번 다시 시도하게 했고, 그래도 실패하면 원인과 재설정 버튼을 보내도록 했습니다.

- 기타 문제들: 예약 작업 헤더를 잘못 넣어 401 오류가 나기도 했습니다. 노션 칸 이름을 바꿀 때 배포를 같이 맞춰야 하는 문제도 겪었습니다. 이런 일들을 겪으며 실전 노하우를 쌓았습니다.

배운 점 (회고)

- 비용은 '느낌'이 아닌 '숫자'로 확인할 것: 막연히 비싸다고 생각했지만 실제 비용은 매우 적었고, 원인은 다른 곳에 있었습니다.

- 선택과 집중: 24시간 켜 둘 장비를 고민하기보다, 24시간 꼭 필요한 기능만 가벼운 봇으로 떼어 내는 편이 훨씬 효율적이었습니다.

- 역할의 명확한 분리: AI는 언어 이해(읽기)만 맡고, 규칙과 계산은 코드가 처리해야 시스템이 흔들리지 않습니다. 또 하나의 봇에 너무 많은 메시지가 섞이면 정작 중요한 것이 흐려집니다.

- 기록의 힘: AI와 함께 일할 때는 진행 기록과 인계 메모를 꼼꼼히 남겨야 합니다. 그래야 다음 세션에서도 맥락을 잃지 않고 작업을 이어 갈 수 있습니다.

다음 계획

아직 실행하지는 않았지만, 다음 기능들을 구상하고 있습니다.

- "매주 월요일 9시" 같은 반복 알림

- /취소, /완료 명령어

- 버튼 없이 넘긴 알람을 다시 보는 기능

2
2개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만