11 · 개인 사이드 프로젝트 · 앱 개발
Daylane
회사·사이드 프로젝트·여가처럼 성격이 다른 하루를 프로필로 나눠 한 화면에 담는 플래너입니다. 쓰던 애플 캘린더·미리알림을 그대로 이어 쓰면서 iPhone·iPad·Mac에서 같은 코드로 동작합니다.
배경
회사 일과 사이드 프로젝트, 개인 일정이 여러 앱에 흩어져 있어 하루를 한눈에 보기 어려웠습니다. 이미 쓰고 있는 애플 캘린더·미리알림을 버리지 않고, 그 위에 프로필·목표·일기를 얹는 플래너를 직접 만들기로 했습니다.
문제
애플 캘린더(EventKit)와 양방향으로 잇고 기기 사이를 iCloud Drive로 맞추는 과정에서, 기기 로컬 id가 스냅샷에 섞여 일정이 배수로 늘어나거나 기기끼리 서로의 행을 지우는 사고가 실제로 났습니다. 한 번은 일정 8만 행에 삭제 표시 8만 개가 쌓였습니다.
기존 Flutter 캘린더 플러그인은 macOS를 지원하지 않고 관리가 멈춰 있었고, Flutter 캔버스로는 Apple Pencil의 보간·예측 샘플을 받을 수 없었습니다.
접근
- EventKit·iCloud Drive·PencilKit·CalDAV 네이티브 플러그인을 Swift로 직접 작성해 iOS·macOS가 같은 코드를 공유
- 데이터마다 진실 소스를 분리 — 애플 필드는 EventKit, Daylane 전용 필드는 iCloud 스냅샷, 기기 사정은 동기화하지 않음
- 사고 이후 동기화 원칙 수립: 기기 로컬 id 비전파, 3회 연속 미확인과 삭제 가드를 통과해야만 삭제, 기기 사정으로 수정 시각을 올리지 않음, 모든 기기에서 같은 답을 내는 중복 병합
- 애플 캘린더의 이동 시간을 CalDAV로 양방향 연동하고, 앱 전용 암호는 기기 키체인에만 저장
- 홈·잠금화면 위젯, 라이브 액티비티, 일정 배경화면 렌더러, 단축어 App Intent 구현
- 리빌드 감사 테스트와 실기 프로파일로 화면 성능을 측정하며 개선
돌아보며
동기화는 기능이 아니라 사용자 데이터를 지키는 약속이라는 것을 사고를 겪으며 배웠습니다. 그래서 규칙을 기억에 맡기지 않고 작업 문서와 테스트로 남겨, 다음 작업자가 같은 사고를 반복하지 않게 했습니다.
다음 작업Pangea →코드에서 화면·API 관계를 추출해 변경 영향과 프로젝트 맥락을 연결하는 AI 프로젝트 매니지먼트 도구

