AI 개인비서 자동화 · 텔레그램 대화를 개인 데이터베이스와 일정으로 자동 연결한 시스템 구현 기록
AI 자동화 시스템 · Oracle Cloud · mTLS 보안

정보를 아카이브하고 일정을 관리해주는
나만의 비서

메모·일정·기프티콘·자료가 도구마다 흩어지고 분류는 수동이라 기억에 의존했습니다.
채팅에 던져두면 알아서 분류·저장하고 필요한 것을 먼저 알려주는 개인용 비서를
직접 설계·개발해 클라우드 서버에 띄우고 24시간 운영하고 있습니다.

Telegram

자료·일정·기프티콘 입력 창구

n8n + Claude Code

내용을 읽고 분류해 아래 처리를 실행

Oracle Cloud

n8n이 24시간 구동되는 클라우드 서버

Google

Calendar와 Sheets에 저장·관리

이 문서의 구성

이런 걸 처리합니다

채팅에 던지는 행동 하나로 분류 · 저장 · 일정 등록 · 알림까지 이어집니다.

01

자료 아카이브

링크·이미지·문서를 보내면 내용을 분석해 자동으로 분류·저장합니다.

02

일정 등록

자연어로 보낸 일정에서 날짜·시간·장소를 파악해 Google Calendar에 자동 등록합니다.

03

기프티콘 관리

이미지에서 유효기간과 사용처를 추출해 등록하고, 만료 전에 알립니다.

04

자료 검색

"저번주에 넣어둔 거 뭐였지" 같은 대화로 저장해 둔 것을 찾습니다.

05

아침 일정 보고

오늘의 일정·만료 임박 항목·주요 할 일을 매일 아침 먼저 알립니다.

06

저장 결과 회신

어느 카테고리에 어떤 제목으로 저장했는지 즉시 회신해, 잘못 분류되면 바로 잡을 수 있습니다.

실제 화면

아침 모닝 리포트부터 자료 저장·일정 등록까지, 하나의 대화창 안에서 끝납니다.

텔레그램 대화 화면 — 모닝 리포트, 링크 저장 결과 회신, 일정 등록 및 캘린더 연동

전체 구조와 흐름

메시지 한 건이 거치는 경로 전체입니다. AI는 두 지점에서만 개입하고, 나머지는 n8n 룰이 처리합니다.

flowchart TB U["사용자
텔레그램"] --> PRE["n8n 전처리
입력 유형 판별"] PRE -->|"파일 · 버튼 · 명시 접두어"| GUARD PRE -->|"자연어 문장"| AI1["AI 의도분류
저장·조회·수정·삭제·완료"] AI1 --> GUARD["n8n 가드레일
강등 · 폴백"] GUARD --> AI2["AI 본분석
제목·분류·요약·날짜 추출"] AI2 --> SAVE["저장 · 실행"] SAVE --> SH["Google Sheets
색인 DB"] SAVE --> DR["Google Drive
파일 보관"] SAVE --> CA["Google Calendar
일정 등록"] SAVE --> RE["텔레그램 회신
저장 결과 즉시 확인"] SCH["매일 08:00 스케줄"] --> MR["모닝 리포트
날씨 · 일정 · 추천"] MR --> RE GUARD -.->|"판정 기록"| LOG["판정 로그"]

도구별 역할

도구맡은 일
Telegram자료를 받는 창구이자 모닝 리포트를 발송하는 채널. 버튼·명령어로 즉시 조회도 처리
n8n룰베이스 분기와 스케줄 트리거로 전체 파이프라인을 연결. AI 장애 시 폴백 담당
OpenAI일상 문장에서 의도를 분류하고 제목·카테고리·기한을 추출하는 판정 담당
Oracle Cloudn8n 컨테이너가 24시간 구동되는 서버. 재부팅에도 자동 기동되도록 구성
GoogleSheets를 DB로 써서 분류된 항목을 저장하고, 일정은 Calendar에, 파일은 Drive에 보관
Claude Code워크플로우·API 연동·서버 인프라·보안 설정을 함께 만든 개발 파트너
Claude
Claude Code개발 보조·코드 작성
n8n
n8n워크플로우 자동화
Telegram
Telegram채팅형 인터페이스
OpenAI
gpt-4o-mini분류·요약·추출 (전 타입)
Google Sheets
Google Sheets인덱스 DB
Google Drive
Google Drive파일 저장소
Google Calendar
Google Calendar일정·기한 자동 등록
Oracle
Oracle CloudAlways Free VM · 서울 리전
Caddy
CaddyReverse Proxy · mTLS 보안

룰과 AI의 역할 분담

정해진 프로세스는 n8n 룰이 강제하고, 대화의 변수만 AI가 판정합니다.

n8n

정해진 프로세스의 강제

의도가 정해지면 카테고리 읽기 → 내용 분석 → 시트 저장 → 캘린더 등록까지 정해진 순서로만 진행합니다. 버튼 응답과 명시 명령은 AI 판정을 거치지 않고 룰이 즉시 처리합니다.

얻은 것 — 같은 요청은 언제나 같은 결과

AI

대화의 자유도

정해진 명령어 없이 일상 문장에서 의도를 분류하고, "스벅" 같은 표현을 "스타벅스"로 연결합니다. 이미지·PDF도 읽어 브랜드·유효기간 같은 정보를 추출합니다.

얻은 것 — 말하듯 던져도 알아듣는 유연함

AI를 태우지 않는 경우

다음은 의도가 이미 확정이라 AI 호출 자체를 건너뜁니다. 호출 비용과 지연이 없고, 판정이 흔들릴 여지도 없습니다.

파일 · 이미지 · PDF 버튼 응답 수정: 삭제: 메모: 조회: 완료

AI 판정을 그대로 실행하지 않는다

의도분류 결과는 n8n 룰을 한 번 더 통과합니다. 잘못된 실행보다 잘못된 저장이 낫다는 기준으로 설계했습니다.

조건조치이유
확신도가 기준에 못 미침저장으로 강등수정·삭제는 되돌리기 어렵지만 저장은 나중에 지우면 됩니다
대상 없는 삭제 요청조회로 강등후보를 먼저 보여주고 확인받는 경로로 돌립니다
AI 응답 실패 · 지연룰베이스 폴백AI가 멈춰도 비서는 멈추지 않고, 최소한 기록은 남습니다

매일 아침 모닝 리포트

이 시스템에서 유일하게 먼저 말을 거는 기능입니다. 매일 08:00에 네 가지를 한 통으로 묶어 보냅니다.

01

날씨

출근·퇴근 시간대의 기온과 강수확률. 비가 올 확률이 높은 시간대에만 우산 표시를 붙입니다.

02

미세먼지

에어코리아가 발표하는 공식 등급을 그대로 표시합니다.

03

오늘 일정

오늘과 내일 일정, 기한이 임박한 항목을 함께 보여줍니다.

04

오늘의 추천

다시 볼 만한 항목을 하나 골라 띄우고, 확인한 것은 체크 버튼으로 정리합니다.

알림은 하루 한 통으로 제한했습니다 알림이 잦으면 읽지 않게 됩니다. 추천도 여러 종류를 한꺼번에 띄우지 않고 우선순위대로 한 종류만 채택합니다.

일정 처리

단순 저장을 넘어, 일정 메시지에서 의미 있는 구조를 추출해 Google Calendar에 정확하게 연결합니다.

확정과 미확정을 구분한다

같은 일정이라도 예약이 끝났는지 아직인지에 따라 제목이 달라집니다. 캘린더만 봐도 무엇을 더 해야 하는지 알 수 있습니다.

말투판정결과 제목
"이번주 토요일 테니스야"확정테니스 일정
"까꿍이 병원 가야해"미확정까꿍이 병원 예약필요

일정 형태에 맞춰 등록 방식을 고른다

01

시간 지정

시작 시간이 있으면 그대로 등록합니다. 종료 시간이 없으면 1시간을 기본값으로 씁니다.

02

하루종일

시간 없이 날짜만 있으면 종일 이벤트로 등록합니다.

03

날짜 범위

시작일과 종료일이 다르면 범위 전체를 하나의 이벤트로 등록합니다.

한 메시지에 일정이 여러 건이면 쪼개서 등록합니다 "테니스 일정 등록해" 뒤에 날짜별 코트가 여러 줄 나열되면, 공통 정보를 각 줄에 붙여 건별로 분해한 뒤 각각 등록합니다.

저장되는 데이터

메시지 원문을 그대로 쌓지 않습니다. 검색·수정·자동화에 쓸 수 있는 형태로 쪼개서 Google Sheets에 넣습니다.

시트역할담기는 것
색인 시트본체 DB저장된 모든 항목. 제목·분류·요약·기한·상태 등
분류 사전카테고리대분류·소분류와 각각의 설명. AI는 이 목록 안에서만 고릅니다
판정 로그기록의도분류 결과 전건. 입력·판정·확신도·근거
대기열임시사용자 확인을 기다리는 중간 상태. 매일 새벽에 정리됩니다

항목마다 남는 값

titleAI가 만든 짧은 제목
L1 / L2대분류와 소분류
entities검색용 핵심 키워드
summary요약 텍스트
due_date기한 · 일정일
recurrence반복 패턴
status진행 · 완료 · 삭제
cloud_pathDrive 파일 경로
소분류는 쓰면서 늘어납니다 AI가 고를 소분류가 없으면 사용자에게 키워드를 물어보고, 받은 값을 분류 사전에 추가합니다. 다음부터는 그 소분류를 AI가 선택할 수 있습니다.

판정 품질을 올린 방법

처음엔 끝말 키워드 룰로 의도를 판별했습니다. 룰을 늘릴수록 서로 충돌해서, 목록이 아니라 판정 방식을 바꿨습니다.

오분류를 먼저 모았다

실제로 보낸 문장잘못된 판정원인
내일 3시 은비랑 저녁 약속 잡아줘조회로 오판어미 '~줘'가 조회 룰에 걸림
메가커피 기프티콘 썼어저장으로 오판'썼어'가 완료 키워드 목록에 없음
저번주에 넣어둔 거 뭐였지저장으로 오판어떤 룰에도 걸리지 않아 기본값으로 떨어짐

키워드 목록을 의미 정의로 바꿨다

정의 "어미로 판정하지 말고 행동의 대상으로 판정하라"를 원칙으로 명시했습니다. 새 정보가 있으면 저장, 이미 저장된 무언가를 전제하면 조회·수정·삭제·완료입니다.
예시 헷갈리는 경계마다 정답 예시를 붙였습니다. "수세미 사야해"는 저장, "수세미 샀어"는 완료, "살 거 뭐였지"는 조회처럼 한 단어 차이를 구분선으로 삼았습니다.
검증 모든 판정을 로그로 남겨 무엇이 왜 그렇게 판정됐는지 되짚습니다. 오분류 사례는 그대로 테스트셋이 되어, 판정 로직을 바꿀 때마다 배포 전에 다시 통과시킵니다.

오라클 클라우드 인프라 & mTLS 단말 보안

n8n은 Oracle Cloud Always Free VM에서 24시간 상시 가동됩니다. n8n 관리 화면은 mTLS로 잠겨 있어 클라이언트 인증서가 설치된 단말에서만 접근 가능합니다. Telegram 봇 통신과 외부 API 아웃바운드는 mTLS 영향 없이 정상 동작합니다.

인프라 구조

항목값
클라우드Oracle Cloud Always Free
리전서울
도메인전용 고정 도메인 (Telegram Webhook 직결)
가용성24시간 상시 가동 · PC 의존 없음

mTLS 보안 구조

Caddy가 리버스 프록시로 동작하며, /webhook* 경로만 개방하고 그 외는 클라이언트 인증서가 없으면 403을 반환합니다. Telegram 봇 통신과 외부 API 아웃바운드는 영향 없습니다.

Telegram Bot Webhook 이벤트 전송 (/webhook/wj-*)
브라우저 (n8n 관리 UI) 클라이언트 인증서 설치된 단말에서 접근
Google / OpenAI API 아웃바운드 — 서버에서 직접 호출, 영향 없음
요청
Caddy Reverse Proxy
인증서 검증
라우팅
/webhook* 경로 OPEN 인증서 없어도 통과 → n8n
인증서 있는 단말 ALLOWED n8n 관리 UI 접근 가능
인증서 없는 요청 403 BLOCKED 로그인 화면조차 차단

결과적으로 가능한 일

정보 수집함 · AI 분류기 · 일정 자동화 실행기를 하나로 묶은 시스템

보낸 정보를 이해하고, 저장 가능한 형태로 정리하고, 일정이면 캘린더까지 연결한 뒤 다음 날 아침에 다시 꺼내주는 개인 운영 도구입니다. Oracle Cloud에서 24시간 가동되고, 관리 화면은 mTLS로 잠겨 있습니다.

메모 저장 이미지 분석 PDF · 문서 정리 링크 보관 자동 카테고리화 소분류 자동 학습 중복 확인 조회 수정 삭제 파일 저장 Calendar 자동등록 반복 일정 감지 다중 일정 분해 AI 의도분류 완료 · 소진 처리 만료 항목 알림 모닝 리포트 mTLS 단말 보안 오라클 클라우드 상시가동