시작하기 전에 — 지난 한 주 배운 것
이 프로젝트는 맨땅에서 시작한 게 아니라, 아루나 AI 온보딩 과정의 1주차 커리큘럼을 따라오면서 쌓은 것들 위에 서 있습니다. 하루씩 이런 걸 배우고 저장해뒀어요.
| 일차 | 배운 것 | 이 프로젝트에 쓰인 곳 |
|---|---|---|
| 1일차 | 나의 학습메이트 만들기 | AI에게 역할과 말투를 정해주는 법 → 비서 봇의 성격 설정 |
| 2일차 | 4주 로드맵과 랜딩 페이지 | ”브리핑 비서 만들기”를 4주 목표로 확정 |
| 3일차 | 내 사이트를 인터넷에 올리기 (배포) | “배포”라는 개념 — 이 글 후반의 웹앱 배포에서 재등장 |
| 4일차 | 되돌릴 수 있는 안심 (커밋과 버전관리) | 코드를 고치다 망쳐도 되돌릴 수 있다는 자신감 |
| 5일차 | 내 프로젝트 PRD 만들기 | 브리핑에 뭘 담을지 문서로 먼저 정리 |
| 6일차 | 세부계획 세우고 MVP 첫 조각 만들기 | 밤 브리핑 첫 버전이 여기서 나옴 |
| 7일차 | 한 주 돌아보기 (회고일지와 종합사례글) | 지금 이 글 |
특히 5~6일차가 컸습니다. 만들기 전에 “뭘 만들 건지”를 글로 정리해두니, 실제 만들 때 헤매는 시간이 확 줄었어요.
완성된 모습
매일 아침 8시쯤, 텔레그램으로 이런 게 옵니다.
☀️ 7/29(수) 아침 브리핑
━ 오늘 일정 ━
· 10:00 ○○ 미팅
· 15:30 △△ 약속
━ 오늘 날씨 ━
· 최고 32℃ / 최저 25℃
· 강수확률 32%
· 접이식 우산 하나 넣어두시면 좋겠어요 🌂
· 많이 더워요. 물 자주 드세요 💧
오늘도 무리하지 마시고 차분하게 보내시길 바라요.
밤 10시에는 그날 쓴 돈이 정리돼서 옵니다.
🌙 오늘의 가계부
━ 오늘 지출 ━
· ○○카페 5,600원 (식비/카페)
· △△마트 32,000원 (생활비)
합계 37,600원 · 2건
━ 이번달 ━
예산 대비 ○○% 소진
💡 오늘의 카드 팁
• A카드 커피 할인(월 2회) 다 썼어요 → 다음은 B카드로
잘 자요 😴
그리고 낮에 궁금한 게 생기면 봇에게 그냥 물어봅니다.
나: 배달앱 시킬 건데 무슨 카드로 할까?
봇: B카드가 좋아요. 배달앱 10% 할인이 월 한도까지 됩니다.
직접 입력하는 건 없습니다. 카드를 긁으면 알아서 기록되고, 정해진 시간에 알아서 정리돼서 옵니다.
1부. 먼저 알아야 할 5가지
기술 용어를 모르면 설명서를 읽어도 무슨 말인지 모릅니다. 딱 5개만 알고 가면 됩니다.
① AI는 “기억하지 못한다”
챗봇과 대화하면 이전 얘기를 기억하는 것처럼 보이죠. 사실은 매번 지금까지의 대화 전체를 다시 들려주기 때문입니다.
내가 "안녕" 이라고 보내면
→ 실제로는 "(지금까지 나눈 대화 전부) + 안녕" 이 통째로 전송됨
이걸 알아야 하는 이유가 있습니다. 대화가 길어질수록 요금이 비싸집니다. 뒤에서 이것 때문에 사고 난 얘기가 나옵니다.
② API = 프로그램이 쓰는 출입구
우리가 챗봇 화면에서 대화하듯, 프로그램도 AI에게 말을 걸 수 있습니다. 그 통로가 API예요.
중요: 챗봇 구독료(월 정액)와 API 요금은 완전히 별개입니다. 구독한다고 API가 열리지 않아요.
③ API 키 = 출입증
API를 쓰려면 “나는 누구다”를 증명해야 하는데, 그게 API 키입니다. 긴 문자열로 된 비밀번호라고 생각하시면 돼요. 남에게 보이면 그 사람이 내 요금으로 AI를 쓸 수 있습니다.
④ 서버 = 24시간 켜져 있는 남의 컴퓨터
봇이 내 질문에 언제든 답하려면, 누군가 24시간 듣고 있어야 합니다. 내 노트북은 자니까 안 되죠. 서버는 인터넷 어딘가에서 24시간 켜져 있는 컴퓨터를 월 몇 천 원에 빌리는 겁니다. 모니터도 키보드도 없어서 글자로만 조작해요.
⑤ 앱스크립트 = 구글이 공짜로 빌려주는 미니 서버
구글 시트에는 Apps Script라는 기능이 붙어 있습니다. 구글 안에서 코드를 돌릴 수 있고, “매일 밤 10시에 실행” 같은 예약도 되고, 무료입니다.
이게 이 글의 핵심 재료입니다. 정해진 시간에 정해진 일을 하는 것은 전부 이걸로 해결됩니다.
2부. 전체 설계 — 일을 둘로 나눈다
처음엔 서버의 AI 비서가 브리핑까지 전부 만들게 했습니다. 그런데 쓰다 보니 일의 성격이 두 가지라는 걸 알게 됐어요.
| 성격 | 맡길 곳 | |
|---|---|---|
| 아침·밤 브리핑 | 정해진 걸 정해진 시간에 | 앱스크립트 (무료, 코드가 계산) |
| 질문에 답하기 | 무엇을 물을지 모름 | 서버의 AI (유연하지만 유료) |
【 브리핑 — 서버 필요 없음, 전부 무료 】
구글 캘린더 ─┐
날씨 서비스 ─┼→ 앱스크립트가 모아서 → 텔레그램 발송 (아침)
폰 결제알림 → 구글 시트 → 앱스크립트가 정리 → 텔레그램 발송 (밤)
【 대화 — 서버의 AI 비서 】
내 질문 → 텔레그램 → 서버의 AI가 생각하고 → 답변
이렇게 나누면 좋은 점이 세 가지입니다.
- 브리핑 비용이 0원 — AI를 안 거치니까요
- 숫자를 지어낼 수 없음 — 합계·날씨·일정은 코드가 계산합니다. AI에게 시키면 그럴듯한 거짓 숫자가 나올 수 있어요 (실제로 겪었습니다)
- 서버가 죽어도 브리핑은 옴 — 두 축이 독립적이라
3부. 준비물과 비용
| 항목 | 비용 | 어디에 필요 |
|---|---|---|
| 텔레그램 + 구글 계정 | 무료 | 전부 |
| 안드로이드 폰 | - | 가계부 자동기록 (아이폰은 알림 접근 불가) |
| AI API 키 | 무료 한도로 충분 | 대화 봇 |
| 서버 | 월 몇 천 원 | 대화 봇에만 |
브리핑만 원하시면 돈이 한 푼도 안 듭니다. 서버는 대화 기능을 원할 때만 빌리면 돼요.
4부. 텔레그램 봇 만들기 (공통 준비, 10분)
봇은 “내 프로그램이 쓰는 텔레그램 계정”입니다.
- 텔레그램에서
@BotFather검색 → 대화 시작 /newbot입력 → 봇 이름과 아이디 정하기 (_bot으로 끝나야 함)- 토큰이라는 긴 문자열이 나옴 → 봇의 비밀번호. 어디에도 공개 금지
- 만든 봇을 찾아 아무 말이나 걸어두기 (내가 먼저 말을 걸어야 봇이 나에게 보낼 수 있음)
@userinfobot에게 말 걸면 나오는 내 id 적어두기 (봇이 “누구에게” 보낼지)
5부. 밤 가계부 브리핑 (서버 없이, 구글만으로)
흐름
카드 결제 → 폰에 알림 → 자동화 앱이 낚아챔 → 구글 시트에 기록
→ 밤 10시에 앱스크립트가 정리 → 텔레그램
1단계 — 구글 시트와 앱스크립트
시트를 만들고 거래내역 탭을 준비합니다. 그리고 상단 메뉴 확장 프로그램 → Apps Script로 코드 편집기를 엽니다.
여기서 만든 코드가 하는 일은 문자열 해석입니다.
"[○○카드 승인] 5,600원 07/26 21:14 △△카페"
↓
날짜 / 시각 / 금액 / 상점 / 분류(키워드 규칙으로)
이 코드를 웹앱으로 배포(배포 → 새 배포 → 웹 앱, 액세스 “모든 사용자”)하면 인터넷 주소가 생기고, 폰이 그 주소로 알림을 쏘는 구조입니다. 3일차에 배운 그 “배포”가 여기서 다시 나옵니다.
⚠️ 제일 많이 헤매는 지점: 코드를 고치고 저장해도 웹앱에는 반영이 안 됩니다. 웹앱은 배포한 순간의 코드를 씁니다. 고칠 때마다 배포 → 배포 관리 → ✏️ 수정 → 「새 버전」 → 배포. (“새 배포”를 누르면 주소가 바뀌어 폰 설정을 다시 해야 하니 주의)
2단계 — 폰 알림 낚아채기
안드로이드 자동화 앱 MacroDroid(무료 버전 충분)에서:
- 트리거: 알림 수신 (카드사·은행 앱)
- 액션: HTTP 요청으로 알림 내용을 웹앱 주소로 전송
🔒 주소만 알면 누구나 내 시트에 데이터를 넣을 수 있으니, 요청에 비밀 단어를 같이 보내고 코드에서 맞을 때만 처리하게 했습니다.
3단계 — 예외 처리 (작업량의 절반)
알림이 생각보다 지저분합니다. 하나씩 발견해서 막았어요.
- “이번 달 누적 ○○원” 이 같이 옴 → 지출로 세면 안 됨
- 카드값 납부 알림 → 개별 결제가 이미 기록됐으니 두 번 세면 안 됨
- 내 통장끼리 이체 → 돈이 나간 게 아님
- 취소·환불 → 마이너스로 상쇄
- 간편결제는 알림이 2개 옴 (페이 앱 + 카드사) → 처음엔 뒤에 온 걸 버렸다가 카드 정보가 사라지는 문제 발생 → 두 알림을 하나로 합치는 방식으로 해결
압권은 이거였습니다. 어느 날 배달앱 결제가 ‘저축’으로 분류돼 있더군요. 알림 속 “누적금액은?” 이라는 안내 문구에서 “적금” 두 글자가 저축 키워드에 걸린 거예요. 키워드 분류는 이런 함정이 있으니, 원문(메모)을 같이 저장해두고 이상하면 대조하는 게 중요합니다.
4단계 — 밤 10시 예약
브리핑 코드를 만들고, 왼쪽 시계 아이콘 → 트리거 추가로 “매일 22시”를 겁니다. 트리거로 도는 코드는 웹앱과 달리 저장만 하면 바로 반영됩니다.
6부. 아침 브리핑 (이것도 서버 없이!)
처음엔 서버의 AI가 만들었는데, 지금은 앱스크립트로 옮겼습니다. 무료이고, 숫자가 정확하고, 오히려 만들기도 쉬웠어요.
재료가 전부 공짜입니다
| 정보 | 어디서 | 비고 |
|---|---|---|
| 오늘 일정 | 구글 캘린더 | 같은 구글 계정이라 인증도 필요 없음 |
| 날씨 | Open-Meteo (무료 API) | API 키 불필요 |
| 증시 지수 | 시트의 GOOGLEFINANCE 함수 | API 키 불필요 |
캘린더가 특히 놀라웠는데, 서버에서 붙이려면 인증 파일을 만들어 옮기는 복잡한 과정이 필요했던 게 앱스크립트에서는 코드 한 줄입니다. 구글 것끼리는 그냥 통해요.
💡 자동화하고 싶은 서비스가 있다면 API(프로그램용 통로)가 있는지 먼저 확인하세요. 저는 원래 다른 캘린더를 쓰다가 이것 때문에 구글 캘린더로 옮겼습니다. 도구를 바꾸는 게 코드로 우회하는 것보다 빠릅니다.
여기서 겪은 시행착오 4가지
① 지역 이름이 엉뚱한 곳으로 인식됨 — 날씨 서비스에 동네 이름을 넣었더니 전혀 다른 지역이 나왔습니다. 위도·경도 좌표로 지정하니 정확해졌어요. 지명은 서비스마다 해석이 달라서, 좌표가 확실합니다.
①-2 무료 서비스가 구글 서버를 차단함 — 내 컴퓨터에서는 잘 되던 날씨 서비스(wttr.in)가 앱스크립트에서만 “접속 불가”로 실패했습니다. 개인용 무료 서비스는 구글 서버처럼 여럿이 공유하는 IP의 접속을 막는 경우가 있어요. 프로그램용으로 설계된 무료 API(Open-Meteo) 로 바꾸니 해결됐습니다. 무료 재료를 고를 땐 “브라우저용”이 아니라 “프로그램용”인지를 보세요.
② 증시 수식이 계속 실패 — 앱스크립트가 시트에 수식을 쓰고 곧바로 같은 실행에서 결과를 읽으려 했더니, 계산이 비동기라 아무리 기다려도 안 나왔습니다. 해결은 발상 전환이었어요. 수식을 시트에 계속 살려두면, 다음 실행 때는 이미 계산된 값을 바로 읽습니다. 첫 실행만 실패하고 그다음부터는 항상 성공.
③ 브리핑이 엉뚱한 시간에 옴 — 예약 시간이 세계표준시 기준이었습니다. 한국은 9시간 빠르니 계산해서 넣어야 해요. 그리고 앱스크립트 트리거는 정각이 아니라 ±15분 안에서 실행됩니다. 이건 구글 사양이라 받아들여야 합니다.
숫자를 행동으로 바꿔주기
날씨 섹션에서 제일 신경 쓴 부분입니다.
- ❌ “강수확률 60%”
- ✅ “오후에 비 소식이 있어요. 우산 챙기세요 ☂️”
숫자를 그대로 주면 아침에 해석할 여유가 없어요. if 문 몇 개로 기온·강수확률을 준비물 문장으로 바꿨습니다. AI 없이도 충분히 “비서 같은” 문장이 나옵니다.
7부. 대화 봇 — 여기서만 서버가 등장합니다
“물어보면 답하는” 기능은 앱스크립트로는 어렵습니다. 언제 올지 모르는 메시지를 계속 듣고 있어야 하고, AI가 여러 단계로 생각할 시간도 필요하거든요. 그래서 AI 에이전트 프로그램을 서버에 올렸습니다.
1단계 — 서버 빌리기
클라우드 업체(Vultr, DigitalOcean 등)에서 제일 작은 사양을 고릅니다. 월 몇 천 원.
- 운영체제: Ubuntu 최신
- 위치: 한국 또는 일본
- 만들면 IP 주소와 비밀번호가 나옴 → 메모
2단계 — 서버 접속
윈도우 검색창에 powershell → 파란 창에서:
ssh root@서버IP주소
처음엔 계속할지 물으면 yes, 그다음 비밀번호 입력.
비밀번호를 쳐도 화면에 아무것도 안 보이는 게 정상입니다. 별표도 안 뜹니다. 그냥 끝까지 치고 엔터.
업체 홈페이지의 웹 콘솔도 있지만 한글 키보드에서 특수문자가 깨지는 일이 잦습니다. PowerShell 접속이 훨씬 안정적이에요.
root@서버이름:~# 으로 바뀌면 성공.
3단계 — AI 에이전트 설치
저는 오픈소스 에이전트(헤르메스)를 썼습니다. 프로그램마다 명령이 다르니 공식 문서를 따라가되, 어떤 단계인지 알면 훨씬 수월합니다.
- 설치 스크립트 실행 — 문서의 설치 명령 복사·실행
- 초기 설정 — 어떤 AI를 쓸지(제공자)와 API 키 입력
- 텔레그램 연결 — 4부에서 만든 봇 토큰 입력 → 봇에게 말을 걸어 내 계정과 페어링
- 상시 실행 등록 — 서버가 재부팅돼도 자동으로 켜지게 (systemd 서비스)
여기까지 하면 텔레그램에서 봇에게 말을 걸 때마다 서버의 AI가 답합니다.
4단계 — AI API 키는 무료로
Google AI Studio에서 키를 받는데, 결제 수단을 연결하지 않으면 무료입니다. 하루 사용량 제한이 있지만 개인 비서 용도로는 충분했어요.
무료 티어는 입력 내용이 서비스 개선에 쓰일 수 있다는 조건이 보통 붙습니다. 민감한 내용을 다루신다면 약관을 확인하고 결정하세요. 그리고 무료의 숨은 장점 — 한도가 안전장치가 됩니다. 뭔가 잘못돼도 한도에서 멈추니까요.
5단계 — 봇이 지어내지 못하게 울타리 치기
써보니 AI는 모르는 걸 물으면 그럴듯하게 지어냅니다. 제가 안 가진 카드를 추천한 적도 있어요.
해결은 참고 문서였습니다. 카드 혜택 정리를 서버에 파일로 두고, 봇에게 이렇게 기억시켰어요.
카드 질문을 받으면 이 파일을 먼저 읽고 답해.
내 카드는 파일에 적힌 4장뿐이야. 다른 카드는 절대 추천하지 마.
마땅한 게 없으면 지어내지 말고 "없다"고 말해.
AI에게는 판단 재료를 주고, 지어낼 여지를 막는 것 — 이게 대화 봇을 쓸 만하게 만드는 핵심이었습니다.
8부. 5만원이 사라진 사건, 그리고 안전장치
대화 봇을 올리고 일주일 뒤, API 선불 크레딧 5만원이 다 떨어졌습니다. 브리핑은 멀쩡히 오고 있었는데요.
원인은 설정 한 줄 — 대화 기록이 한 번도 초기화되지 않는 설정이었습니다. 1부에서 말한 “AI는 매번 전체 대화를 다시 받는다” 때문에, 6일치 대화가 통째로 쌓인 채 메시지 하나에 15만 토큰씩 전송되고 있었어요. 설정을 고치니 요청당 토큰이 29분의 1로 떨어졌습니다.
이 사건에서 나온 안전장치 4가지:
- 예산 알림 — 클라우드 결제 설정에서 월 한도 + 50%·90% 메일. 5분이면 겁니다. 제일 먼저 하세요.
- 세션 리셋 — 대화 기록을 매일 자동 초기화. 중요한 기억은 별도 메모리에 남아서 봇이 나를 잊지 않습니다
- 키는 코드 밖으로 — 앱스크립트 “스크립트 속성” 같은 보관함에 두면, 코드를 남에게 보여줘도 키가 안 딸려감
- 실패를 보이게 — 실패하면 브리핑에 ”(○○ 불러오지 못했어요)” 한 줄이 남게. 조용한 실패가 제일 위험합니다. 눈에 보이는 고장은 금방 고치는데, 조용히 도는 문제는 다 새고 나서야 압니다
9부. 자주 막히는 곳
| 증상 | 원인 | 해결 |
|---|---|---|
| 서버 비밀번호 쳐도 반응 없음 | 원래 화면에 안 보임 | 그냥 치고 엔터 |
| 웹 콘솔 글자 깨짐 | 한글 입력기/특수문자 | PowerShell로 접속 |
| 코드 고쳤는데 그대로 | 웹앱은 재배포 필요 | 배포 관리 → 수정 → 새 버전 |
| 브리핑이 엉뚱한 시간에 | 세계표준시 | 9시간 계산 / 시간대 설정 확인 |
| 시트 수식이 스크립트에서 안 읽힘 | 비동기 계산 | 수식을 상주시키고 다음 실행에 읽기 |
| 날씨가 엉뚱한 지역 | 지명 해석 오류 | 좌표로 지정 |
| 내 PC에선 되는데 스크립트에선 접속 실패 | 무료 서비스가 구글 서버 차단 | 프로그램용 API로 교체 |
| AI가 없는 걸 지어냄 | 모르는데 답하려 함 | 참고 문서 + “모르면 모른다고 해” |
| 명령어 command not found | 앞 줄까지 같이 복사됨 | 명령어 한 줄만 복사 |
마무리 — 시작한다면 이 순서로
1주차 텔레그램 봇 + 밤 가계부 (구글만으로, 무료)
└ 여기서 "폰 알림이 자동으로 시트에 쌓이는" 재미를 느끼면 계속하게 됩니다
2주차 아침 브리핑 추가 (역시 무료)
그다음 대화 봇이 필요해지면 서버 (월 몇 천 원 + API 무료 한도)
한 번에 다 만들려 하지 마세요. 저도 6일차에 MVP 한 조각부터 시작했고, 지금 모습은 만들고 → 틀린 걸 발견하고 → 고치는 반복의 결과입니다. 완벽하지 않아도, 매일 밤 “오늘 얼마 썼는지” 알려주는 것만으로 충분히 쓸모 있었어요.