사용자의 기록정보는 어떻게 저장되는가
2026-07-27 · 개념 Q&A · 드라이브 동기화 v2 기준
Q. 사용자가 저장한 데이터와 연결된 정보는 구글드라이브에 저장되는 방식인가? 기록정보가 어떻게 저장되는 거지?
A. 2단계 구조다. 기록은 ① 사용자 브라우저에 즉시 저장되고(항상 · 오프라인 동작), 구글 계정을 연결했다면 ② 3초 뒤 사용자의 드라이브에 파일 1개(running_records.json)로 자동 업로드된다. 서버·DB는 어디에도 없다.
1차 저장소 — 사용자 브라우저 (항상 · 즉시)
| 데이터 | 저장 위치 |
|---|---|
| 기록 목록 (거리·페이스·시간 등 전체 필드) | localStorage run.records.v2 |
| 목표 (주간/월간/연간) | localStorage run.goals.v1 |
| 삭제 이력 (동기화 부활 방지 tombstone) | localStorage run.deleted.v1 |
| 사진 원본 (캡쳐 이미지 blob) | IndexedDB — 기록 id를 키로 보관 |
| 설정 (드라이브 연결 상태 · 블로그 설정) | localStorage |
저장 버튼을 누르는 순간 드라이브 연결 여부와 무관하게 여기 먼저 기록된다 — 그래서 오프라인에서도 앱이 완전히 동작한다.
2차 저장소 — 사용자의 구글드라이브 (계정 연결 시)
running_records.json (내 드라이브에 자동 생성 · 사람이 읽을 수 있는 JSON) ├─ records[] ← 기록 전체 — 한 건 = 날짜·거리·페이스·시간·고도· │ 케이던스·심박·출처(source)·원본 캡쳐 연결(source_file_id)· │ 생성/수정 시각(created_at/updated_at) 등 ├─ goals ← 목표 설정 (updated_at 포함) ├─ deleted_ids[] ← 삭제 이력 — 다른 기기에서 부활 방지 └─ schema_version · count · exported_at 등 메타정보
전체 흐름
[기록 저장] → 브라우저에 즉시 저장 (localStorage + 사진은 IndexedDB)
→ 연결돼 있으면 3초 디바운스 후 running_records.json 자동 업로드(덮어쓰기)
[다른 기기] → 접속·첫 클릭·60초 폴링·탭 복귀 시 파일 변경(modifiedTime) 감지
→ 다운로드 → 병합(신규 추가 · 최근 수정본 채택 · 삭제 반영)
핵심 포인트
- 사진은 드라이브의 JSON에 포함되지 않는다. 사진은 기기별 IndexedDB에만 있다. 단, 드라이브 캡쳐에서 가져온 기록이라면 원본 캡쳐가 이미 사용자 드라이브에 존재하며 기록의
source_file_id가 그 파일을 가리킨다 — "사진의 정본 = 드라이브의 캡쳐 원본, 숫자 데이터의 정본 = running_records.json"으로 역할이 나뉜다. - 투명성 — 사용자는 자기 드라이브에서 이 파일을 직접 열어볼 수 있다(일반 JSON 텍스트). 실수로 삭제해도 앱이 다음 저장 때 자동으로 새로 만든다(파일 ID 404 감지 → 재생성).
- 역할 정리 — 브라우저 = 1차 정본(즉시성·오프라인), 드라이브 = 2차 정본(백업 + 기기 간 동기화 허브). JSON 내보내기 버튼은 여기에 더한 수동 3중 백업 수단.
ℹ️ 관련 문서: PC·모바일 간 데이터 연계 · 드라이브 연동 vs Supabase(BaaS)