피드로 돌아가기
Dev.toFrontend
원문 읽기
Chrome 확장 프로그램과 Node.js 백엔드로 Notion 저널에 양방향 AI 대화 기능 추가
Reflective — AI journaling companion built with Notion MCP and Claude
AI 요약
Context
기존 저널링 도구는 입력된 내용이 저장되기만 하고 사용자와 상호작용하지 않는다. Notion에서 저널을 작성할 때마다 새로운 탭이나 도구로 이동해야 하는 번거로움이 있었다.
Technical Solution
- Chrome 확장 프로그램(Manifest V3, React + TypeScript, Vite, Tailwind)으로 Notion 페이지 옆 사이드 패널 구성: 네비게이션 시 0개의 API 호출 발생
- Node.js + Express 백엔드에서 최근 50개 저널 항목과 14일간의 기분 데이터를 병렬 조회: Promise.all()로 두 가지 데이터를 동시에 fetch
- Claude API(claude-sonnet-4-5)에 시간 기반 컨텍스트 제공: 열람 중인 항목의 작성 날짜 기준으로 이전/이후 항목 분리해 temporal framing 구성
- Server-Sent Events로 초기 로드 진행 상황 스트리밍: 첫 50개 항목 hydration 과정을 단계별로 사용자에게 표시
- Notion API를 통해 분석 결과를 다시 저장: Mood Score(숫자), Mood Tags(다중선택), Themes(다중선택), AI Summary(리치 텍스트), Word Count(숫자), Session Complete(체크박스) 속성을 페이지 업데이트
- 별도 Mood Log 데이터베이스로 일일 기분 추적: 저널을 작성하지 않은 날에도 기분 기록 가능
- 초기 실행 시 Notion API로 Journal Entries 데이터베이스, Mood Log, Weekly Summaries 데이터베이스, 시작 항목, 대시보드 페이지를 자동 생성: 약 10초 소요
Key Takeaway
Notion의 다중선택 속성으로 저장된 메타데이터를 Notion의 내장 필터·정렬·그룹화 기능과 결합하면 별도 커스텀 쿼리 인터페이스 없이 시간이 지남에 따라 자동으로 강화되는 데이터 시스템을 구축할 수 있다. 스키마 설계 부담을 데이터베이스 도구의 네이티브 기능으로 옮기는 것이 핵심이다.
실천 포인트
Notion 통합이 필요한 사이드바 기반 도구를 개발할 때 Server-Sent Events와 ReadableStream을 조합하면 장시간 API 호출 중에도 사용자에게 진행 상황을 실시간으로 피드백할 수 있다. 또한 동일 세션 내에서 여러 Notion 페이지를 탐색할 때 채팅 로그에 구분 마커(— now reading: [title] —)를 삽입하면 컨텍스트 전환을 명확하게 표현할 수 있다.