스마트폰 속 삼성 헬스 데이터를
내 앱에서 활용하기
걸음 수, 심박수, 수면, 혈압… 사용자의 갤럭시 워치·링·폰에 쌓인 건강 데이터를 안전하게 읽고 쓸 수 있게 해주는 공식 개발 도구, Samsung Health Data SDK를 한눈에 정리합니다.
Data SDK란 무엇인가?
삼성 헬스 Data SDK는 스마트폰에 저장되어 있는 삼성 헬스 데이터를 다른 앱에서 사용할 수 있도록 제공하는 SDK입니다.
사용자의 갤럭시 워치·갤럭시 링·스마트폰 센서가 측정한 건강 데이터는 삼성 헬스 앱의 암호화된 저장소(Health Data Store)에 모입니다. Data SDK는 이 "기기 안(on-device)"에 저장된 데이터에 사용자 동의를 받아 접근하는 통로 역할을 합니다. 즉, 서버 API가 아니라 스마트폰 로컬 데이터를 직접 읽고 쓰는 방식입니다.
로컬 데이터 접근
네트워크 서버가 아닌 사용자 기기에 저장된 삼성 헬스 데이터에 직접 접근합니다.
웨어러블 통합
갤럭시 워치·링·헬스 액세서리에서 측정된 풍부한 데이터를 하나로 모아 활용합니다.
직관적 Kotlin API
필터링·집계 기능이 내장되어 적은 코드로 원하는 데이터만 간편하게 조회합니다.
왜 Data SDK를 사용할까?
삼성이 공식적으로 내세우는 세 가지 핵심 가치입니다.
신뢰성 있는 풍부한 데이터
스마트폰 센서와 갤럭시 웨어러블이 측정한 활동·휴식·건강관리 데이터를 폭넓게 제공합니다.
높은 생산성
필터링으로 필요한 데이터만 조회하고, 강력한 집계 기능으로 복잡한 후처리 없이 요약값을 얻습니다.
보안과 프라이버시
삼성 Knox 보안 계층과 사용자 권한·SDK 정책에 따른 엄격한 접근 제어가 적용됩니다.
시작 전 요구사항
Data SDK를 사용하려면 아래 환경이 갖춰져야 합니다.
| 항목 | 요구 사항 |
|---|---|
| 삼성 헬스 앱 | v6.30.2 이상 설치 (사용자 기기) |
| Android | Android 10 (API 레벨 29) 이상 |
| 개발 언어 | Java 17 이상 / Kotlin |
| 테스트 환경 | 실제 기기 필요 — 에뮬레이터 미지원 |
| SDK 라이브러리 | samsung-health-data-api-1.1.0.aar |
Samsung Health Data SDK로 얻을 수 있는 데이터
신규 Samsung Health Data SDK는 25종의 데이터 타입을 DataTypes로 제공합니다.
아래는 6개 카테고리로 정리한 실제 지원 타입이며, 각 타입의 읽기·쓰기 지원 여부를 색으로 표시했습니다.
Activity · 활동
움직임 · 운동Rest · 휴식
수면Food · 식음료
섭취Health Care · 건강관리
바이탈 · 측정Score · 점수
User Profile · 사용자
UUID, CREATED_TIME,
UPDATED_TIME, PACKAGE_NAME(측정 앱), DEVICE_UUID(측정 기기)를
기본으로 포함합니다. "어떤 앱·기기가 언제 측정했는지" 출처를 항상 알 수 있습니다.
SleepType에 통합되었고, 체중·키는 BodyCompositionType·UserProfileDataType에 포함됩니다.
권한 모델 — 사용자 동의가 핵심
건강 데이터는 민감 정보이므로, 앱은 데이터 타입별 + 접근 종류별로 권한을 따로 요청해야 합니다.
권한 단위는 Permission.of(데이터타입, 접근종류) 형태입니다.
| 접근 종류 (AccessType) | 설명 |
|---|---|
READ | 해당 데이터 타입을 읽을 수 있는 권한 |
WRITE | 해당 데이터 타입을 삽입·수정·삭제할 수 있는 권한 |
object Permissions { val PERMISSIONS = setOf<Permission>( Permission.of(DataTypes.STEPS, AccessType.READ), Permission.of(DataTypes.STEPS_GOAL, AccessType.READ), Permission.of(DataTypes.HEART_RATE, AccessType.READ) ) }
getGrantedPermissions()로 실제 승인 여부를 확인한 뒤 데이터에 접근합니다.
사용자는 언제든 일부 권한만 허용할 수 있으므로 항상 승인 여부를 재확인해야 합니다.
핵심 구성요소
Data SDK를 다룰 때 꼭 알아야 할 클래스들입니다.
HealthDataStore
모든 데이터 작업의 진입점. HealthDataService.getStore(context)로 얻으며, 읽기·쓰기·집계·권한 요청을 수행합니다.
DataTypes
걸음 수·심박수 등 데이터 타입 정의 모음. 각 타입에서 요청 빌더(readDataRequestBuilder 등)를 꺼냅니다.
Permission / AccessType
데이터 타입별 읽기·쓰기 권한을 표현하는 단위입니다.
LocalTimeFilter / InstantTimeFilter
조회할 기간(시간 범위)을 지정하는 필터입니다.
ReadSourceFilter
특정 기기(워치·로컬 폰)나 측정 앱으로 데이터 출처를 좁히는 필터입니다.
DataPoint
읽어온 결과의 한 건. 측정값과 함께 데이터 ID·출처(앱/기기) 정보를 담습니다.
데이터 연산 5종
Data SDK가 제공하는 작업(operation)입니다. 데이터 타입마다 지원하는 연산이 다릅니다.
📖 Read (읽기)
기본 쿼리로 데이터 집합을 가져옵니다. readDataRequestBuilder로 기간·정렬·개수·출처를 지정합니다.
🧮 Aggregate (집계)
요약값을 바로 얻습니다. TOTAL·LAST·MIN·MAX 등의 연산을 지원합니다.
➕ Insert / ✏️ Update / 🗑️ Delete
데이터를 삽입·수정·삭제합니다. 각각 insert/update/deleteDataRequestBuilder를 사용합니다.
🔗 Read Associated / 🔄 Query Changes
연관 데이터를 함께 읽거나, 마지막 조회 이후 변경분만 추적합니다.
사용 흐름 5단계
실제 앱에서 데이터를 활용하기까지의 전체 과정입니다.
SDK 추가 & Store 생성
.aar 라이브러리를 추가하고 HealthDataService.getStore(context)로 HealthDataStore를 얻습니다.
권한 요청
requestPermissions(PERMISSIONS, activity)를 호출해 사용자 동의를 받습니다.
권한 확인
getGrantedPermissions()로 실제 승인된 권한을 확인합니다.
요청 빌드 & 실행
데이터 타입의 요청 빌더로 기간·필터를 설정해 readData()/aggregateData()를 호출합니다.
결과 활용
반환된 dataList의 각 DataPoint에서 값을 꺼내 화면에 표시·분석합니다.
실전 코드 예제
① Gradle 의존성
// app/libs 폴더에 samsung-health-data-api-1.1.0.aar 추가 후 dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar")))) implementation(libs.gson) }
② Store 생성 & 권한 요청
val healthDataStore = HealthDataService.getStore(applicationContext) // 권한 요청 (사용자 동의 화면 표시) healthDataStore.requestPermissions(Permissions.PERMISSIONS, activity) // 실제 승인된 권한 확인 val granted = healthDataStore.getGrantedPermissions(Permissions.PERMISSIONS) if (granted.containsAll(Permissions.PERMISSIONS)) { // 데이터 접근 가능 }
③ 심박수 읽기 (기간 필터)
suspend fun readHeartRate(start: LocalDateTime, end: LocalDateTime) { val store = HealthDataService.getStore(applicationContext) val timeFilter = LocalTimeFilter.of(start, end) val request = DataTypes.HEART_RATE.readDataRequestBuilder .setLocalTimeFilter(timeFilter) .setOrdering(Ordering.DESC) .build() val heartRateList = store.readData(request).dataList heartRateList.forEach { point -> /* point 값 사용 */ } }
④ 특정 기기 데이터만 조회 (출처 필터)
// 갤럭시 워치가 측정한 데이터만 val request = DataTypes.HEART_RATE.readDataRequestBuilder .setSourceFilter(ReadSourceFilter.fromDeviceType(DeviceGroup.WATCH)) .setLocalTimeFilter(timeFilter) .setOrdering(Ordering.ASC) .build() // 또는 현재 스마트폰(로컬 기기)이 측정한 데이터만 // .setSourceFilter(ReadSourceFilter.fromLocalDevice())
⑤ 걸음 수 집계 (TOTAL)
val result = healthDataStore.aggregateData(aggregateRequest) var stepCount = 0L result.dataList.forEach { aggregated -> aggregated.value?.let { stepCount = it } // 기간 내 총 걸음 수 합산 }
참고 자료
아래는 본 강의 자료의 출처이자, 더 깊이 학습할 수 있는 공식 문서 링크입니다.