URL을 Notion에 자동 저장하고 Telegram으로 확인하는 시스템 제작기

사무실에서 YouTube 영상이나 글을 보다가 휴대폰으로 보내고 싶을 때마다 주소와 메모를 하나씩 옮겨 적는 과정이 번거로웠다. URL과 짧은 메모를 한 번 입력하면 Notion에 저장하고, 성공 여부를 Telegram으로 확인하는 개인용 시스템을 만든 이유다.  

처음 시도와 실제 제약

처음에는 Cloudflare Workers와 개인 도메인을 이용했지만 회사 보안망에서 요청이 차단됐다. 같은 기능이라도 접속 주소에 따라 통과 여부가 달랐기 때문에, 백엔드를 Vercel Serverless Function으로 옮기고 기본 Vercel 주소를 사용했다. 이 변경의 핵심은 기능 추가가 아니라 실제 사용하는 네트워크에서 요청이 도달하는 경로를 확보하는 것이었다. 회사나 기관 네트워크에서는 우회 자체를 목적으로 사용하지 않고 보안 정책과 정보 반출 규정을 먼저 확인해야 한다.

확인된 데이터 흐름

  1. HTML·JavaScript 화면에서 URL과 메모를 입력한다.
  2. Vercel Serverless Function이 요청을 받아 Notion API 형식으로 가공한다.
  3. Notion 데이터베이스에 URL과 메모를 저장한다.
  4. 저장이 성공하면 Telegram Bot이 확인 메시지를 보낸다.
Telegram 알림은 Notion 앱을 다시 열지 않고도 요청이 끝났는지 확인하기 위해 추가했다. 원본 URL은 Notion에 정리하고 Telegram에는 즉시 확인할 메시지가 남으므로 두 서비스의 역할을 분리했다.

CORS에서 막혔던 부분

브라우저 화면과 Serverless Function의 출처가 다르면 실제 저장 요청 전에 OPTIONS 사전 요청이 발생한다. 이 응답에 허용 출처와 메서드가 빠지면 Notion API를 호출하기도 전에 브라우저가 요청을 중단한다. Vercel 함수에서 preflight를 먼저 처리하도록 한 뒤 실제 저장 요청이 전달됐다. 현재 로컬 작업 공간에서는 이 개인 도구의 원본 Vercel 함수 코드를 찾지 못했다. 그래서 구체적인 응답 코드, Notion 속성명이나 재시도 횟수는 추정해 추가하지 않았다. 위 내용은 기존 제작 기록에서 확인되는 실제 구성과 해결 과정으로 한정했다.

비밀값과 접근 권한

Notion API 키와 Telegram 봇 토큰은 화면 코드에 넣지 않고 Vercel 환경변수로 분리했다. Notion 데이터베이스도 통합 연결에 필요한 권한만 부여해야 한다. Telegram 봇은 사용자가 먼저 대화를 시작해야 1:1 메시지를 보낼 수 있으며, 채널을 사용할 때는 필요한 게시 권한만 준다. 실제 토큰, 개인 Telegram ID, Notion 데이터베이스 ID와 개인 URL은 이 글에 공개하지 않는다. 내부 자료나 개인정보가 포함된 주소 역시 외부 서비스로 보내지 않는다.

서버 알림 구조와 연결하기

이 도구에서는 저장 완료 확인을 위해 Telegram을 사용했다. 여러 서비스의 장애 상태와 중복 알림까지 관리하는 운영 구조는 Telegram 서버 오류 알림 구축 기록에서 확인할 수 있다.