똑딱주기적으로 반복하는 일정을 관리하는 개인 리마인더 앱
TypeScript
React Native
Expo
TanStack Query
Supabase
26.04 - ing
구분
사이드 프로젝트
기간
Apr 1, 2026
주요 스택
TypeScript
React Native
Expo
TanStack Query
Supabase
한 줄 소개
주기적으로 반복하는 일정을 관리하는 개인 리마인더 앱
대표 여부
대표 여부
status
Published
slug
ttokttak
역할 및 기여관련 링크세부 경험1. 반복 일정 계산 모델과 알림 예약 최적화2. 개인 일정 내용 보호를 위한 암호화·복구·로컬 알림 경계 설계3. 반복 일정·알림·개인정보 흐름의 회귀 테스트
역할 및 기여
- 1인 사이드 프로젝트로 제품 기획과 UI·데이터 구조 설계부터 React Native 구현, Supabase 연동, 테스트, App Store 배포와 출시 후 업데이트까지 직접 진행했습니다.
- 반복 일정 생성·수정·삭제, 홈·목록·캘린더·상세 조회, 완료·건너뛰기 기록과 기기 로컬 알림 동기화 등 핵심 일정 관리 흐름을 구현했습니다.
- Apple·Google 로그인, 일정 암호화·복구, 계정 삭제를 구현했으며 출시 후에도 알림 안정성, 반복 일정 종료일, 다국어·테마 기능을 업데이트하며 운영하고 있습니다.
관련 링크
세부 경험
1. 반복 일정 계산 모델과 알림 예약 최적화
반복 일정의 개별 회차를 미리 저장하지 않고 반복 규칙과 완료·건너뛰기 기록으로 필요한 범위만 계산하도록 설계했습니다. 규칙 변경 시 새 버전을 적용 시점과 함께 저장해 과거 기록은 기존 규칙에 유지하고 이후 일정만 새 규칙으로 계산했습니다. 이를 통해 규칙이나 종료일이 바뀌어도 기존 회차를 다시 생성해야 하는 부담을 줄였습니다.
홈·목록·캘린더·상세 화면과 알림은 같은 계산 규칙을 사용하되 각 화면과 알림 예약에 필요한 형태로 변환했습니다.
기기에서 예약 가능한 알림 수가 제한돼 먼 미래 알림이 가까운 알림보다 먼저 예약될 수 있는 문제를 발견했습니다. 알림 동기화 기준을 분리하고 제한된 범위에서는 예정 시각이 가까운 순서로 예약하도록 개선했습니다.



동일한 반복 규칙을 반영한 홈·캘린더·생성 화면
2. 개인 일정 내용 보호를 위한 암호화·복구·로컬 알림 경계 설계
일정 제목과 설명은 사용자의 생활 패턴이 드러날 수 있는 정보라고 보고 서버에 평문으로 저장하지 않도록 했습니다. 앱에서 일정을 암호화하고 기기 Expo SecureStore에 저장한 키로 조회 시 복호화합니다.
새 기기 복구를 위해 앱에 고정 키를 두는 방식도 검토했지만 노출 위험이 있어 제외했습니다. 대신 로그인 후 호출되는 Supabase Edge Function이 암호화 키 복구만 담당하도록 분리했으며 서버 함수는 일정 내용을 직접 복호화하지 않습니다.
알림도 원격 푸시 대신 기기 로컬에서 예약했습니다. 앱에서 복호화한 제목과 예정 시각만 사용해 일정 내용이 외부 푸시 서버나 전송 로그를 거치는 범위를 줄였습니다.
엄격한 종단간 암호화보다는 데이터베이스 단독 유출에 대한 보호와 로그인 기반 새 기기 복구 사이의 균형을 선택했습니다. 키 교체와 기존 데이터 재암호화는 후속 과제로 남겼습니다.

3. 반복 일정·알림·개인정보 흐름의 회귀 테스트
반복 규칙과 알림 조건이 바뀌면 여러 화면과 예약 결과가 함께 영향을 받고 개인정보 흐름도 암호화·복구·알림을 함께 확인해야 했습니다.
AI는 누락하기 쉬운 테스트 조건을 점검하는 보조 도구로 활용했습니다. 실제 검증이 필요한 케이스를 선별해 Jest 회귀 테스트로 남겼습니다.
2026년 7월 21일 기준 53개 테스트 스위트·318개 테스트가 통과하며, 반복 일정 계산, 완료·건너뛰기, 알림 동기화, 암호화 키 복구와 계정 삭제 흐름을 자동 검증합니다.
대표적으로 다음 회귀를 검증했습니다.
- 완료일 기준 반복에서
완료는 실제 완료일로 기준을 옮기고,건너뛰기는 기존 주기를 유지하는지 확인했습니다.
- OS 알림 예약 상한에 가까워지면 가까운 일정을 우선하고, 기존의 먼 알림을 교체하는지 확인했습니다.
- 새 기기이거나 로컬 키가 올바르지 않을 때, 서버에 보관한 래핑된 키를 통해 암호화 키를 복구하고 기기에 다시 저장하는지 확인했습니다.