다음 표에는 Google Health API에서 각 유형의 표현과 각 유형이 사용 가능한 범위를 이해하는 데 도움이 되는 여러 열과 함께 전체 데이터 유형 목록이 포함되어 있습니다.
데이터 유형 필드
Google Health API 데이터 유형 표에는 각 데이터 유형의 표현과 요구사항을 이해하는 데 도움이 되는 여러 필드 열이 포함되어 있습니다. 이러한 열은 다음과 같습니다.
| 필드 | 설명 |
|---|---|
dataType |
엔드포인트 URL에 사용되는 하이픈으로 구분된 식별자 (예: active-minutes)입니다. |
filter 매개변수 |
일일 롤업 및 롤업 요청에서 dataType 필터 매개변수의 값으로 사용되는 밑줄로 구분된 식별자 (예: active_minutes)입니다. |
| 레코드 유형 | 기록된 데이터의 구조와 형식을 나타냅니다. 내부적으로는 데이터 포인트의 리소스 표현과 일치합니다. 사용할 수 있는 값은 다음과 같습니다.
|
| 사용 가능한 작업 | 데이터 유형에 지원되는 API 메서드 (예: list, create, rollUp)를 나열합니다. |
| 범위 | 데이터 유형에 액세스하는 데 필요한 OAuth 범위입니다. |
| 웹훅 지원 | 새 데이터가 동기화될 때 데이터 유형이 웹훅을 사용하여 실시간 알림을 지원함을 나타냅니다. |
| True zeros 지원 | 데이터 유형이 명시적 0 값 기록을 지원하여 활성 0 값(예: 활성 시간(분) 0분)과 누락되거나 기록되지 않은 데이터를 구분함을 나타냅니다. |
| 스토리지 해상도 | 데이터 포인트가 저장되는 최소 기록 또는 샘플링 간격입니다 (예: steps의 경우 1분). 롤업의 경우 하위 간격 데이터 아티팩트 없이 균등하게 분산된 집계를 보장하기 위해 권장되는 최소 windowSize를 나타냅니다. |
| 호환 기기 | 이 데이터 유형을 기록하고 Google Health API에 동기화할 수 있는 실제 기기의 확장 가능한 목록입니다 (Fitbit 앱 사용). |
| 데이터 유형 | 사용 가능한 작업 |
범위 |
|---|---|---|
|
활동 에너지 소모량
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
활동적 시간(분)
dataType:
active-minutesfilter parameter: active_minutes
레코드 유형: 인터벌
스토리지 해상도: 1분
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
액티브존 미닛
dataType:
active-zone-minutesfilter parameter: active_zone_minutes
레코드 유형: 인터벌
스토리지 해상도: 1분
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
활동 수준
|
list, reconcile | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
고도
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
혈당
|
list, get, reconcile, rollup, dailyRollup | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
체지방
dataType:
body-fatfilter parameter: body_fat
레코드 유형: 샘플
호환 기기
|
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
심박수 구간 내 칼로리
|
rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
심부 체온
|
list, get, reconcile, rollup, dailyRollup | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 심박 변이도
dataType:
daily-heart-rate-variabilityfilter parameter: daily_heart_rate_variability
기록 유형: 일일
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 심박수 구간
dataType:
daily-heart-rate-zonesfilter parameter: daily_heart_rate_zones
기록 유형: 일일
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 산소 포화도
dataType:
daily-oxygen-saturationfilter parameter: daily_oxygen_saturation
기록 유형: 일일
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 호흡수
dataType:
daily-respiratory-ratefilter parameter: daily_respiratory_rate
기록 유형: 일일
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 안정 시 심박수
dataType:
daily-resting-heart-ratefilter parameter: daily_resting_heart_rate
기록 유형: 일일
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 수면 온도 편차
dataType:
daily-sleep-temperature-derivationsfilter parameter: daily_sleep_temperature_derivations
기록 유형: 일일
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
일일 최대 산소 섭취량
dataType:
daily-vo2-maxfilter parameter: daily_vo2_max
기록 유형: 일일
호환 기기
|
list, reconcile | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
거리
dataType:
distancefilter parameter: distance
레코드 유형: 인터벌
스토리지 해상도: 1분
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
심전도 (ECG)
dataType:
electrocardiogramfilter parameter: electrocardiogram
레코드 유형: 세션
호환 기기
|
list | .ecg.readonly |
|
운동
dataType:
exercisefilter parameter: exercise
레코드 유형: 세션
호환 기기
|
list, get, reconcile, create, update, batchDelete | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
층수
|
reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
음식
|
list, get | .nutrition.readonly.nutrition.writeonly |
|
음식 측정 단위
dataType:
food-measurement-unitfilter parameter: food_measurement_unit
기록 유형: 음식
호환 기기
|
list, get | .nutrition.readonly.nutrition.writeonly |
|
심박수
dataType:
heart-ratefilter parameter: heart_rate
레코드 유형: 샘플
스토리지 해상도: 1초
호환 기기
|
list, reconcile, rollup, dailyRollup | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
심박 변이도
dataType:
heart-rate-variabilityfilter parameter: heart_rate_variability
레코드 유형: 샘플
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
키
|
list, get, reconcile, create, update, batchDelete | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
수분 섭취 기록
|
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | .nutrition.readonly.nutrition.writeonly |
|
불규칙한 심장 리듬 알림
dataType:
irregular-rhythm-notificationfilter parameter: irregular_rhythm_notification
레코드 유형: 세션
|
list | .irn.readonly |
|
월경 기간
|
create, update, batchDelete | .reproductive_health.writeonly |
|
분위기
|
create, update, batchDelete | .mindfulness.writeonly |
|
영양 기록
dataType:
nutrition-logfilter parameter: nutrition_log
레코드 유형: 세션
호환 기기
|
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | .nutrition.readonly.nutrition.writeonly |
|
배란 테스트
|
create, update, batchDelete | .reproductive_health.writeonly |
|
산소 포화도
dataType:
oxygen-saturationfilter parameter: oxygen_saturation
레코드 유형: 샘플
스토리지 해상도: 1분
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
수면 중 호흡수 요약
dataType:
respiratory-rate-sleep-summaryfilter parameter: respiratory_rate_sleep_summary
레코드 유형: 샘플
호환 기기
|
list, reconcile | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
러닝 최대 산소 섭취량
dataType:
run-vo2-maxfilter parameter: run_vo2_max
레코드 유형: 샘플
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
비활동 기간
dataType:
sedentary-periodfilter parameter: sedentary_period
레코드 유형: 인터벌
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
피부 온도 센서
v4beta |
list | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
|
수면
dataType:
sleepfilter parameter: sleep
레코드 유형: 세션
호환 기기
|
list, get, reconcile, create, update, batchDelete | .sleep.readonly.sleep.writeonly |
|
단계
dataType:
stepsfilter parameter: steps
레코드 유형: 인터벌
스토리지 해상도: 1분
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
수영 거리 데이터
dataType:
swim-lengths-datafilter parameter: swim_lengths_data
레코드 유형: 인터벌
호환 기기
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
증상
|
create, update, batchDelete | .logged_symptoms.writeonly |
|
심박수 구간 내 시간
|
list, reconcile, rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
총 칼로리
dataType:
total-caloriesfilter parameter: total_calories
레코드 유형: 인터벌
스토리지 해상도: 1분
호환 기기
|
rollup, dailyRollup | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
최대 산소 섭취량
dataType:
vo2-maxfilter parameter: vo2_max
레코드 유형: 샘플
호환 기기
|
list, reconcile | .activity_and_fitness.readonly.activity_and_fitness.writeonly |
|
무게
dataType:
weightfilter parameter: weight
레코드 유형: 샘플
호환 기기
|
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete | .health_metrics_and_measurements.readonly.health_metrics_and_measurements.writeonly |
쿼리 제약조건
API에서 데이터 포인트, 롤업 또는 일일 롤업을 쿼리할 때는 다음 제약 조건을 염두에 두세요.
- 필터 요구사항:
total-calories와 같은 일부 읽기 전용 파생 데이터 유형에는 간격 시작 시간을 지정하는 필터가 필요합니다(물리적 시간 또는 시민 시간 사용). - 쿼리 범위 한도: 롤업 및 일일 롤업 집계 엔드포인트는 데이터 유형에 따라 최대 쿼리 범위 한도를 적용합니다.
calories-in-heart-rate-zone,heart-rate,active-minutes,total-calories의 최대 쿼리 범위는 14일입니다.- 다른 모든 데이터 유형의 최대 쿼리 범위는 90일입니다.
- 롤업 기간:
rollUp엔드포인트를 호출할 때windowSize기간은 1초 ("1s") 이상이어야 합니다. 1초 미만의 기간은INVALID_ARGUMENT로 거부됩니다. 또한 하위 간격 간의 불균등한 분포를 방지하려면 데이터 유형의 기본 스토리지 해상도보다 크거나 같은windowSize를 선택합니다 (예:steps및distance와 같은 1분 간격 데이터 유형의 경우"60s"). 자세한 내용은 롤업 기간 및 스토리지 해상도를 참조하세요.
일일 데이터 유형과 인터벌 데이터 유형 비교
심박 변이도 (HRV) 또는 산소 포화도 (SpO2)와 같은 특정 생리적 측정항목의 경우 Google Health API는 일일 버전과 인터벌 버전이라는 두 가지 데이터 유형을 제공합니다. 이 차이점을 이해하는 것이 사용 사례에 적합한 측정항목을 선택하는 데 중요합니다.
일일: 하루 전체에 대한 사전 집계된 단일 요약입니다. 상위 수준의 추세 및 일일 대시보드에 사용하여 처리를 절약합니다.
인터벌: 하루 종일 측정되는 세분화된 고해상도 측정값입니다. 이를 사용하여 일중 변동을 차트로 표시하거나 심층적인 시간별 분석을 수행합니다.
데이터 사용 가능 여부
사용자 데이터 업데이트는 활동 추적기를 동기화하거나 Google Health 앱에 새 데이터를 수동으로 입력한 후에만 가능합니다. Fitbit 기기와 Google Health 앱은 모바일 기기에서 Google Health 앱이 열려 있고 두 기기가 활성 데이터 연결 상태이며 블루투스 범위 내에 있는 경우 15분마다 자동으로 동기화할 수 있습니다. 사용자가 MobileTrack을 사용하여 활동을 추적하는 경우 앱이 열려 있는 한 MobileTrack은 매시간 동기화됩니다.
이전 데이터 쿼리
Google Health API의 핵심 이점 중 하나는 장기간에 걸쳐 사용자의 성과를 추적하고 건강 상태를 모니터링할 수 있다는 것입니다. 사용자의 데이터는 기록된 시점까지 거슬러 올라가 쿼리할 수 있습니다. API는 애플리케이션에서 사용할 수 있는 이전 데이터의 양에 제한을 두지 않습니다.
하지만 이전 데이터 쿼리는 여전히 표준 비율 제한의 적용을 받습니다. 시스템 안정성을 관리하고 과도한 페이로드를 방지하기 위해 Google Health API는 엔드포인트별 페이지 크기로 자동 페이지 매김을 사용합니다. 다음 경계 및 동작을 참고하세요.
- 자동 페이지로 나누기: 긴 데이터 범위를 쿼리하는 경우 API는 해당 엔드포인트의 페이지 크기 한도까지의 첫 번째 결과 페이지만
nextPageToken와 함께 반환합니다.nextPageToken을 사용하여 후속 페이지를 요청해야 합니다. - 가변 페이지 크기: 상한은 엔드포인트 및 데이터 유형에 따라 다릅니다. 대부분의 데이터 유형에서 페이지 크기는 최대 10,000개로 제한됩니다.
하지만
exercise및sleep와 같은 특정 데이터 유형의 경우 기본 및 최대 페이지 크기는 25로 제한됩니다. 예를 들어 클라이언트가 지난 10년 동안의 모든 수면 데이터를 요청하는 경우에도 API는 첫 페이지에 수면 세션 25개만 반환합니다. - 롤업 기간 제한: 데이터 롤업 및 집계 엔드포인트(예:
rollUp및dailyRollUp)의 경우 쿼리 기간은 데이터 유형에 따라 제한됩니다.calories-in-heart-rate-zone,heart-rate,active-minutes,total-calories의 최대 범위는 14일입니다.- 다른 모든 롤업 데이터 유형의 경우 최대 범위는 90일입니다.
애플리케이션에 필요한 이전 데이터의 양에 따라 전체 데이터 세트를 검색하려면 페이지를 순차적으로 페이지로 나누어야 합니다. 애플리케이션의 데이터 동기화 프로세스를 설계할 때 이 점을 염두에 두세요.
최적의 성능을 보장하고 API 오류를 방지하려면 이전 데이터를 쿼리할 때 다음 가이드라인을 따르세요.
단계별 데이터 동기화 (핫 로드와 콜드 로드 비교)
- 초기 '핫' 로드: 기본 로드 시퀀스 중에 최근 7~14일의 데이터만 가져와 렌더링합니다. 이렇게 하면 사용자가 장기 실행 쿼리를 기다리지 않고도 데이터를 즉시 볼 수 있습니다.
- 백그라운드 '콜드' 로드: 기본 UI가 렌더링된 후 이전 데이터 검색을 비동기식 우선순위가 낮은 큐 또는 백그라운드 프로세스에 위임합니다.
집계를 위한 쿼리 청킹
- 롤업 및 일일 롤업 엔드포인트는 최대 기간 제한 (데이터 유형에 따라 14일 또는 90일)을 적용하므로 대규모 이전 집계 쿼리를 이러한 제한 내에서 더 작은 순차적 간격으로 세분화해야 합니다.
- 동시 실행 한도를 준수하고 안정적인 UI 진행률 표시기를 유지하기 위해 이러한 하위 쿼리를 안전하게 일괄 처리하거나 시퀀싱합니다.
사전 집계된 롤업 활용
사전 집계된 요약 엔드포인트 (예: DailyRollUpDataPoints)를 사용하도록 개요 대시보드 및 추세 차트를 재구성합니다. 이렇게 하면 백엔드의 컴퓨팅 오버헤드와 클라이언트로의 네트워크 전송 시간이 크게 줄어듭니다.
복원력 있는 오류 처리 (스마트 재시도)
- 비율 제한 (
429 Too Many Requests) 및 서버 게이트웨이 제한 시간(504 Gateway Timeout)이 발생하면 엄격한 지수 백오프 처리를 구현합니다. 실패한 대규모 페이로드를 즉시 재시도하지 마세요. 즉시 재시도하면 백엔드 정체가 가중되고 시스템 성능 저하가 심화됩니다.
서드 파티 액세스
Fitbit 기기는 서드 파티 애플리케이션 또는 서비스와 직접 통신할 수 없습니다. 이러한 기기는 Google Health 앱과만 통신하고 동기화하도록 설계되었습니다.
기기는 하루 종일 Google Health 앱이 열려 있을 때마다 또는 블루투스가 활성화되어 있고 앱이 백그라운드에서 실행 중인 경우 15분마다 데이터를 자동으로 동기화합니다. 이 동기화 프로세스가 완료되면 Google Health API를 통해 서드 파티 서비스에서 데이터를 사용할 수 있습니다.
데이터 품질 및 유효성 필터링
Google Health API는 맞춤 클라이언트 측 노이즈 필터링 없이도 신뢰할 수 있는 건강 수치를 제공하기 위해 센서 원격 분석을 검증하고 잘못된 측정값을 제외한 후 응답을 반환합니다.
- 분 단위 혈중 산소 포화도 (
oxygen-saturation)의 경우 API는 검증된 수치만 반환하고 팔 움직임, 느슨한 손목 착용 또는 50% 미만의 센서 신뢰도 점수로 인해 잘못된 것으로 표시된 분과 잘못된 수치 전후 3분, 4분 미만의 격리된 유효한 구간을 삭제합니다. 따라서 분 단위 범위는 희소할 수 있으며 공백이 있을 수 있습니다. 자세한 내용은 분 단위 SpO2 필터링 및 데이터 유효성을 참고하세요.
거리 표준
elevationGainMillimeters와 같은 운동 거리는 다음과 같은 이유로 밀리미터 단위로 측정됩니다.
- 데이터 정밀도 유지: 밀리미터를 사용하는 가장 중요한 이유는 읽고 제공하는 데이터의 정밀도를 유지하기 위해서입니다. 밀리미터와 같은 세분화된 단위를 사용하면 측정값을 높은 정확도로 표현할 수 있습니다.
- 표준화: 밀리미터는 Google 서비스 전반에서 설계된 표준화된 단위입니다. 이러한 일관성은 API의 다양한 부분과 상호작용하는 개발자에게 균일한 환경을 제공하는 데 도움이 됩니다.
- 광범위한 측정 시스템 지원: 밀리미터와 같은 기본 단위를 사용하면 개발자가 미터법, 인치법 또는 기타 측정 시스템을 사용하는지와 관계없이 선택한 다른 단위로 쉽게 변환할 수 있습니다.
가변적인 낮 길이
Health API의 시간 처리는 일광 절약 시간제 또는 여행으로 인한 가변적인 하루 길이를 고려하여 사용자의 시간을 우선시합니다. 모든 데이터 포인트는 실제 UTC 타임스탬프와 이벤트 시점에 활성화된 UTC 오프셋과 함께 저장됩니다. 이를 통해 시스템은 다음을 수행할 수 있습니다.
- 이벤트를 정확한 물리적 순간에 매핑합니다.
- 집계를 위해 사용자의 로컬 컨텍스트에 맞게 시간을 수정합니다.
일광절약시간
일광 절약 시간제가 적용되면 '가을 시간 조정'으로 인해 25시간의 시민일이 발생하고 해당 날짜의 롤업에는 25시간의 데이터가 포함됩니다. '서머타임 시작'은 시간이 표준시로 돌아가는 23시간의 시민일을 초래합니다.
여행
시간대를 넘나드는 여행은 단일 시민일의 물리적 기간에 훨씬 더 큰 변화를 일으킬 수 있습니다.
dailyRollUp 엔드포인트를 사용하여 시간대 차이를 조정합니다. 사용자의 현지 시간에 따라 데이터가 기록된 날짜에 자동으로 데이터를 할당하여 시간대 변경에도 불구하고 하루를 효과적으로 '연결'합니다. 자세한 내용과 예시는 데이터 집계 가이드의 달력 일수 집계를 참고하세요.