JINTAE CHOI

게시글

작업 기록 · 2026.09.23 · 09:00

달력 중심 개인 지식 시스템의 구조

달력, 게시글, 알림, 공개 범위, SEO를 뒷받침하는 데이터 모델과 운영 설계.

영어 원문 · 직접 작성한 번역

홈페이지 구조

홈페이지를 세 계층으로 구성했다.

  1. 나를 나타내는 한 문장.
  2. 월간 달력.
  3. 최근 공개 글.

달력을 주 탐색 화면으로 삼았다. 각 날짜에는 일정과 글 영역이 구분되어 있고, 전체·일정만·글만 보기로 전환할 수 있다.

비공개 글의 제목은 달력에 표시하지만 본문은 공개하지 않는다. 운영자 세션 없이 비공개 글을 누르면 로그인으로 이동하며 인증 후 원래 글로 돌아온다.

비공개 일정은 더 민감하므로 익명 방문자에게 숨기고 운영자에게만 표시한다.

데이터 모델

SQLite 데이터베이스 하나를 사용하며 PRAGMA user_version으로 스키마 버전을 관리한다.

애플리케이션 테이블은 정확히 세 개다.

계층 테이블 역할
L1 users 운영자 계정과 비밀번호 해시
L2 posts 마크다운 글, 게시 시각, 공개·비공개 상태
L2 calendar_events 일정, 시간대, 공개 범위, 고정 알림 상태

SEO, 알림, SMTP 설정, 마이그레이션, 달력 표시 상태, 사이트맵을 위한 별도 테이블은 의도적으로 만들지 않았다.

  • SEO는 표준 게시글 필드에서 파생한다.
  • 현재 요구사항은 일정마다 고정 알림 하나이므로 알림 상태는 일정에 속한다.
  • SMTP 자격 증명은 애플리케이션 도메인 데이터가 아니라 운영 설정이다.
  • 스키마 버전은 마이그레이션 테이블 대신 SQLite 메타데이터로 관리한다.
  • 사이트맵과 robots는 동적으로 생성한다.

기능이 늘어날 때마다 테이블이 중구난방으로 생기는 것을 방지한다.

알림 발송

관리 경로로 만든 모든 일정에는 다음 값이 적용된다.

  • 기본 120분 전 알림
  • 수신자 jintae.mckal.choi@gmail.com
  • 재시도·오류 상태를 일정 자체에 저장

별도의 저자원 알림 컨테이너가 발송 시점이 된 일정을 확인하고 SMTP로 이메일을 보낸다.

Gmail 자격 증명은 소스 관리에 저장하지 않는다. 운영자가 HTTPS 설정 화면에서 Gmail 앱 비밀번호를 입력한다. 저장된 비밀번호는 root 소유 서비스 환경에 보관된 서버 측 Fernet 키로 암호화한다.

MCP 일정 등록 경로

MCP가 SQLite를 직접 수정하지 않도록 정해진 관리 명령을 제공한다.

GPT 요청
→ MCP 도구
→ manage.py event-add
→ 검증된 calendar_events 삽입
→ 달력에 일정 반영
→ 시작 2시간 전 알림 작업이 처리

데이터 모델 경계를 지키고, 임의 SQL이 일반 운영 인터페이스가 되는 것을 방지한다.

SEO

공개 게시글에는 다음 항목이 자동으로 붙는다.

  • 제목 메타데이터
  • 요약·본문에서 만든 설명
  • canonical URL
  • Open Graph 메타데이터
  • Twitter 요약 메타데이터
  • BlogPosting JSON-LD

XML 사이트맵에는 공개 글만 포함한다. 비공개, 로그인, 대시보드, 관리자 경로는 robots 규칙과 페이지별 noindex로 색인에서 제외한다.

모바일 동작

데스크톱 달력은 7열 월간 그리드다. 작은 화면에서는 세로 날짜 목록으로 전환하고 다른 달의 칸을 숨긴다. 일정과 글 영역을 유지해, 사용할 수 없을 만큼 작은 칸으로 축소하는 대신 읽을 수 있게 한다.