노현근Frontend Engineer · Seoul
11 · 개인 사이드 프로젝트 · 앱 개발

Daylane

회사·사이드 프로젝트·여가처럼 성격이 다른 하루를 프로필로 나눠 한 화면에 담는 플래너입니다. 쓰던 애플 캘린더·미리알림을 그대로 이어 쓰면서 iPhone·iPad·Mac에서 같은 코드로 동작합니다.

기간2026.04 - 진행중
역할앱 개발
소속개인 사이드 프로젝트
분류Mobile · App · Desktop
스택
  • Flutter
  • Dart
  • Riverpod
  • drift
  • Swift
  • EventKit
  • WidgetKit
  • PencilKit
  • CalDAV

배경

회사 일과 사이드 프로젝트, 개인 일정이 여러 앱에 흩어져 있어 하루를 한눈에 보기 어려웠습니다. 이미 쓰고 있는 애플 캘린더·미리알림을 버리지 않고, 그 위에 프로필·목표·일기를 얹는 플래너를 직접 만들기로 했습니다.

문제

애플 캘린더(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 구현
  • 리빌드 감사 테스트와 실기 프로파일로 화면 성능을 측정하며 개선

돌아보며

동기화는 기능이 아니라 사용자 데이터를 지키는 약속이라는 것을 사고를 겪으며 배웠습니다. 그래서 규칙을 기억에 맡기지 않고 작업 문서와 테스트로 남겨, 다음 작업자가 같은 사고를 반복하지 않게 했습니다.

함께 일하기 좋은 구조와
오래 쓰이는 제품을 만듭니다.

제품과 팀의 문제를 함께 풀 기회가 있다면 편하게 연락 주세요.

© 2026 노현근Seoul, KR