Pulse Log 요구사항
1. 제품 개요
- 제품명: Pulse Log
- 현재 배포 플랫폼: Android
- 추가 목표 플랫폼: iOS
- 목적: 사용자가 날짜별 아침 혈압, 저녁 혈압, 체중을 빠르게 기록하고 캘린더와 그래프로 확인할 수 있게 한다.
- 저장 방식: 기본 기능은 기기 로컬 저장을 기준으로 한다.
- 네트워크 의존성: 핵심 기록 기능은 네트워크 없이 동작해야 한다.
2. 플랫폼 원칙
- Android 앱은 기존 Kotlin, Jetpack Compose, Room 구현을 유지한다.
- iOS 앱은 Android 배포에 영향을 주지 않되 Kotlin Multiplatform 공통 모듈을 사용한다.
- 공통 모듈은 모델, 정책, use case, repository 계약을 우선 공유한다.
- 두 플랫폼은 사용자 흐름, 화면 구성, 문구, 데이터 의미를 최대한 동일하게 유지한다.
- 플랫폼별 OS 기능은 각 플랫폼의 네이티브 API를 사용한다.
- Android Room migration과 iOS 로컬 저장소 migration은 서로 독립적으로 관리한다.
3. 공통 기능 요구사항
- 첫 진입 시 오늘 날짜를 기본 선택한다.
- 메인 화면은 입력, 캘린더, 그래프 흐름을 제공한다.
- 사용자는 선택 날짜 기준으로 아침 혈압, 저녁 혈압, 체중을 저장할 수 있어야 한다.
- 기존 기록이 있으면 수정할 수 있어야 한다.
- 저장된 항목은 항목별로 삭제할 수 있어야 하며, 삭제 전 확인 단계를 거쳐야 한다.
- 측정 시각은 최초 저장 시점의 기기 시각으로 저장한다.
- 수정 시 기존 측정 시각은 유지한다.
- 혈압 허용 범위는 50~200이다.
- 체중 허용 범위는 0~100kg이다.
- 체중은 소수점 둘째 자리까지 반올림한다.
- 비정상 입력은 저장을 차단하고 사용자에게 피드백을 제공한다.
4. 캘린더 요구사항
- 월별 캘린더는 날짜별 기록 상태를 표시한다.
- 상태는 없음, 아침만, 저녁만, 모두 기록으로 구분한다.
- 오늘 날짜와 선택 날짜는 별도로 구분한다.
- 날짜 선택은 입력, 캘린더, 그래프 흐름에서 공유된다.
- 선택 날짜 요약은 캘린더 상단 또는 인접 영역에서 즉시 갱신된다.
5. 그래프 요구사항
- 기본 표시 기간은 최근 7일이다.
- 사용자는 최근 7일과 최근 30일을 전환할 수 있어야 한다.
- 기록이 없는 날짜도 날짜축에 포함한다.
- 연속 기록 구간은 실선으로 표시한다.
- 중간 미기록 날짜를 건너 연결하는 구간은 점선으로 표시한다.
- 혈압 그래프는 수축기와 이완기 2라인으로 표시한다.
- 혈압 그래프에는 수축기 120, 이완기 80 기준선을 표시한다.
- 체중 그래프는 혈압 그래프와 구분되게 표시한다.
- 그래프를 탭하면 가장 가까운 날짜 열을 선택한다.
- 선택 날짜 카드에는 날짜, 값 목록, 캘린더 이동 액션을 표시한다.
6. 알림 요구사항
- 아침 알림과 저녁 알림은 독립적으로 on/off 가능해야 한다.
- 아침 알림 시간과 저녁 알림 시간은 사용자가 설정할 수 있어야 한다.
- 재알림 사용 여부와 재알림 횟수 설정은 앱 기능에서 제외한다.
- 이미 해당 날짜의 아침 또는 저녁 기록이 있으면 해당 슬롯 알림은 표시하지 않는다.
- Android는 Android 알림 권한과
AlarmManager 기반 예약을 사용한다.
- iOS는 iOS 알림 권한과
UNUserNotificationCenter 기반 로컬 알림을 사용한다.
7. 내보내기 요구사항
- 사용자는 최근 30일 또는 전체 기록을 CSV로 내보낼 수 있어야 한다.
- 사용자는 최근 30일 또는 전체 기록을 PDF 요약본으로 내보낼 수 있어야 한다.
- CSV는 UTF-8 BOM을 포함한다.
- 빈 측정값은
0이 아닌 빈 칸으로 출력한다.
- PDF 요약본에는 기록 기간, 기록 일수, 평균 혈압/체중, 최근 추이 그래프, 최근 기록 표를 포함한다.
- Android는 Android 공유 시트를 사용한다.
- iOS는 iOS 공유 시트를 사용한다.
8. 개인정보 및 데이터 요구사항
- 혈압, 체중, 알림 설정은 민감할 수 있는 건강 관련 데이터로 취급한다.
- 기본 기록 데이터는 사용자의 기기 로컬에 저장한다.
- 앱은 자체 서버로 기록 데이터를 전송하지 않는다.
- 사용자가 내보내기를 실행한 경우에만 CSV/PDF 파일이 생성되고 공유 대상 앱으로 전달된다.
- 개인정보 처리방침은 Android와 iOS 배포 상태를 모두 반영해야 한다.
9. iOS 동등성 요구사항
- iOS 첫 배포 목표는 Android 핵심 기능의 동등한 재현이다.
- 화면 순서, 주요 버튼 위치, 색상 톤, 카드 구조, 피드백 방식은 Android 앱을 기준으로 한다.
- 검증, 캘린더, 그래프, 내보내기, 알림 판단 정책은 Kotlin Multiplatform 공통 모듈을 기준으로 한다.
- iOS Human Interface Guidelines에 맞게 네이티브 컨트롤을 사용하되, 사용자가 느끼는 흐름은 Android와 같게 유지한다.
- iOS 앱은 Android DB 파일과 호환될 필요는 없다.
- iOS 작업은 Android 배포 중인 소스와 빌드 설정을 불필요하게 변경하지 않아야 한다.
10. 테스트 요구사항
- 로직 변경은 단위 테스트를 동반한다.
- 데이터 저장소 변경은 저장소 테스트를 동반한다.
- UI 변경은 안정적인 태그 또는 accessibility identifier를 우선 사용해 테스트한다.
- Android 체크는
scripts/check.ps1 또는 scripts/check.sh를 기준으로 한다.
- 공통 Kotlin 체크는 shared common test를 기준으로 한다.
- iOS 체크는 Xcode test 또는
xcodebuild test를 기준으로 별도 정의한다.