기록 데이터 저장 구조

사용자의 기록정보는 어떻게 저장되는가

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) 감지
          → 다운로드 → 병합(신규 추가 · 최근 수정본 채택 · 삭제 반영)

핵심 포인트

ℹ️ 관련 문서: PC·모바일 간 데이터 연계 · 드라이브 연동 vs Supabase(BaaS)