똑딱주기적으로 반복하는 일정을 관리하는 개인 리마인더 앱
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. 일정 내용 암호화와 새 기기 복구4. 데이터 유실·계정 격리 검증

역할 및 기여

  • 1인 사이드 프로젝트로 제품 기획과 UI·데이터 구조 설계부터 React Native 구현, Supabase 연동, 테스트, iOS App Store 배포와 출시 후 업데이트까지 진행했습니다.
  • 반복 규칙과 완료·건너뛰기 기록을 홈·목록·캘린더·상세 화면에 연결하고, 기기 로컬 알림·배지·iOS 위젯의 갱신 흐름을 구현했습니다.
  • 출시 후에는 일정 모듈의 책임을 정리하고, 계정 전환과 키 복구의 실패 처리, 구버전 데이터 호환성, 실패 영향이 큰 흐름의 테스트를 보완했습니다.

관련 링크

  • iOS App Store
  • GitHub 링크

세부 경험

1. 반복 규칙 변경과 처리 이력 관리

반복 규칙을 수정해도 과거의 완료·건너뛰기 기록을 유지해야 했습니다. 미래의 예정 시점을 미리 저장하면 규칙이 바뀔 때 다시 생성해야 하는 부담도 있었습니다.
반복 규칙과 처리 기록으로 개별 예정 시점(occurrence)을 계산했습니다. 규칙 변경은 새 버전으로 저장하고 버전마다 적용 시점을 두었습니다. 완료일 기준 반복에서는 완료하면 실제 완료일로 다음 주기의 기준을 옮기고 건너뛰면 기존 주기를 유지하도록 구분했습니다.
홈·목록·캘린더·상세 화면과 알림·위젯이 같은 계산 규칙을 사용하도록 연결했습니다. 과거 기록을 유지하면서 변경 이후의 일정을 계산하고 미래 예정 시점을 다시 저장하는 작업을 피할 수 있었습니다.
notion image
알림 시각 변경 전후의 규칙 적용 경계
지난 일정·오늘·다가오는 일정을 구분한 홈 화면
반복 일정을 표시한 월간 달력 화면
반복 조건을 설정하는 일정 추가 화면
동일한 반복 규칙을 반영한 홈·캘린더·생성 화면

2. 계정 전환 시 알림·위젯 동기화

A 계정의 일정 조회가 늦게 끝나는 동안 B 계정으로 전환하면 이전 응답이 새 계정의 알림과 위젯을 덮어쓸 수 있었습니다.
계정별 동기화 세션을 두어 전환 전 작업의 후속 처리를 중단했습니다. 이미 시작한 기기 쓰기와 정리는 공통 큐에서 순서대로 처리했습니다. 알림은 예약 상한 안에서 가까운 일정을 우선하고 기존 예약과 달라진 항목만 취소·추가했습니다.
일정 조회 실패로 기존 알림·위젯을 지우지 않도록 하고 알림과 위젯의 실패를 각각 처리했습니다. 일정 저장 후 기기 갱신이 실패해도 조회 결과는 갱신해 사용자가 저장 결과를 확인할 수 있게 했습니다.
notion image
이전 계정의 늦은 응답과 진행 중 기기 쓰기를 구분한 처리
iOS 홈 화면에서 남은 일정의 제목과 시각을 표시하는 똑딱 위젯
iOS 홈 화면에서 남은 일정의 제목과 시각을 표시하는 똑딱 위젯

3. 일정 내용 암호화와 새 기기 복구

일정 제목과 설명에는 사용자의 생활 패턴이 드러날 수 있어 서버 DB에 평문으로 저장하지 않도록 했습니다. 기기를 바꿔도 기존 일정을 확인할 수 있는 복구 방식이 필요했습니다.
앱에서 제목·설명을 암호화하고 사용자별 키를 Expo SecureStore에 보관했습니다. 앱에 고정 키를 넣는 방식은 제외하고 새 기기에서는 로그인 후 서버에 감싸 저장한 키를 복구하도록 구성했습니다.
알림은 기기에서 예약하고 위젯에는 설명을 제외한 표시 정보만 전달했습니다. 로그아웃·계정 삭제 시 위젯을 로그인 안내로 바꾸고 오류 수집에서는 원문 메시지와 실행 중 변수를 제외해 진단 정보로 노출되는 범위를 줄였습니다.
DB 단독 유출에 대한 보호와 로그인 기반 새 기기 복구 사이의 균형을 선택했습니다. 서버 실행 환경을 신뢰하는 구조이며 엄격한 종단간 암호화는 아닙니다. 위젯 제목은 표시를 위해 로컬 공유 저장소에 평문으로 남습니다. 콘텐츠 키 교체와 기존 데이터 재암호화는 후속 과제로 남겼습니다.
notion image
제목·설명 암호화, 로그인 기반 키 복구, 기기 알림·위젯의 표시 범위
 

4. 데이터 유실·계정 격리 검증

반복 규칙과 기기 동기화가 바뀌면 여러 화면과 예약 결과가 함께 영향을 받았습니다. 테스트는 데이터 유실과 다른 계정의 정보 노출처럼 실패 영향이 큰 상황을 중심으로 구성했습니다.
Jest로 월말·윤년·시간대 경계, 완료·건너뛰기 차이, 계정 전환 중 늦은 응답과 기기 쓰기 순서를 다뤘습니다. 실제 DB에 요청하는 통합 테스트에는 저장 실패 시 일정과 규칙 버전의 롤백, 중복·경합 요청, 다른 계정의 접근 차단과 계정 삭제를 포함했습니다.
iOS E2E에는 일정 생성부터 수정·완료·삭제까지의 흐름, 앱 재실행 후 저장 결과, 기기 키 제거 후 제목·설명 복구를 연결했습니다. OS 알림·위젯과 소셜 로그인은 실제 기기 확인 범위로 구분했습니다.