2025. 1. 28. 14:41ㆍFramework, Library
State of Mind?
오늘 글은 WWDC24에서 watchOS나 visionOS 관련 세션 등을 살펴보다가 우연히 보게 된 내용입니다!
바로 Apple의 건강 관리 프레임워크 HealthKit에서 정신 건강 관리 기능을 소개하고 있는 Explore wellbeing APIs in HealthKit 세션을 글의 주제로 다뤄볼까해요.
*관련한 세션으로, Enhanced suggestions for your journaling app과 Get started with HealthKit in visionOS 등도 함께 소개합니다.
평소 저는 애플워치를 사용하지만, Mindfulness라는 워치용 앱을 사용해 본 적이 한 번도 없었습니다. 여러분은 있으신지요.....?
iOS 17부터는 위의 워치앱을 비롯해서, visionOS나 일반 iOS 건강 앱에서도 State of Mind라고 불리는 정신 건강을 관리할 수 있도록 하는 기능을 추가했다고 합니다.
사실, Apple이 헬스케어 분야에 관심을 갖고 있다는 것은 어느정도 알고 있긴 했지만,
Physical Health 분야를 넘어서 Mental Health에도 관심을 보인 것은 이번 세션이 처음이라 꽤 흥미롭게 찾아본 것 같아요!
하지만, 아직까지 정신 건강 차원에서 Apple이 지원하고 있는 기능은 매우 단순합니다.
자신의 심리 상태를 파악할 수 있는 표준화된 설문지 (GAD-7, PHQ-9)를 통해 객관적으로 상태를 파악하고,
자신의 감정을 사용자가 직접 기록하고, 예전의 입력된 기록을 바탕으로 생성된 통계 자료를 제공하고, 심박수와 함께 1분 동안 명상 (Breathe, Reflect)할 수 있는 간단한 UI를 제공하는 것에 불과하죠.
- Breathe : 화면 애니메이션에 따라 사용자에게 규칙적인 호흡을 유도하여, 마음을 안정시키는 기능
- Reflect : 사용자가 특정 주제나, 긍정적인 생각에 집중할 수 있는 프롬프트를 제공하여, 마음을 차분하게 만드는 데 도움을 주는 기능



"고작 이런 걸로 정신 건강에 얼마나 도움이 된다고"
네 저도 비슷하게 생각했습니다.
그리고 도대체 Apple은 '왜 이런걸 만들었을까' 하며 의구심을 가졌었죠.
하지만, 정말 Apple은 감정을 기록하고 / 이에 대한 통계적 정보를 제공하고 / 성찰의 시간을 갖는 것이 Mental Health에 도움이 된다고 생각하더라고요.
WWDC에서 State of Mind API를 도입한 상황을 설명하며, Apple은 아래와 같이 설명합니다.
✔️ The more specific someone is while describing their feelings, the more clicnical benefit they will get.
= 감정을 구체적으로 묘사하는 것만으로도, 심리적으로 얻을 수 있는 이점이 있다.
✔️ If you’re experiencing an unpleasant feeling, reflection can lessen the amount of time that you’ll feel poorly.
If you’re experiencing a pleasant feeling, you can savor that feeling and enjoy it for a longer period of time.
= 부정적인 감정을 느낀다면 이를 reflection 하는 것이 그 감정을 더 완화시킬 수 있고, 긍정적인 감정을 느끼다면 이를 savor 하며 그 감정을 더 오래 지속할 수 있다.
이 내용을 보니 예전에 봤던 한 영상이 떠오르더라구요.
김영하 작가가 "짜증난다"라는 표현을 학생들에게 사용하지 못하도록 했다는 내용이었는데.
오만가지의 많은 감정을 "짜증"으로 치환해서 사용하는 현대인들에게, 당시의 상황과 감정을 상세하게 묘사하기 위해서는 "짜증난다"라는 표현 말고 다른 다양한 감정 표현들을 사용할 필요가 있다는 것이었죠.
자신의 감정을 정확하게 인지하고, 그 감정을 상세하게 묘사할 수 있다는 것은, 그만큼 당시 상황에 대한 명확한 상태와 원인들 또한 알 수 있다는 것이니까요.
아. 아무튼. 그래서 이러한 이유로 Apple은 Mental Health를 위한 State of Mind API를 iOS 17부터 새롭게 추가했습니다.
State of Mind는 사용자가 자신의 감정 상태를 자세하게 기록하고 추적할 수 있도록 지원하는 기능입니다.
개발자는 해당 API를 사용해서 기존 어플 또는 새로운 어플에 정신 건강 기능을 통합하고, 사용자들이 자신의 감정을 더 잘 이해하고 관리할 수 있다고 소개하고 있죠.
또한, State of Mind는 아래 네 가지의 파라미터를 통해 보다 구체적인 정신 건강 상태의 추적을 돕습니다.
예를 들어, 단순히 <짜증 났다>라고 표현하는 상황을 넘어서, <지금 감정은 순간적으로 느낀 속상함이고, 해당 감정은 직장 동료로부터 비롯되었다.> 같이 자세하게 묘사하는 것이 해당 API의 주 목적이라고 볼 수 있을 것 같은데요.
보다 자세한 내용은 아래에서 차차 더 알아가보도록 하죠.
- Kind : 감정의 종류
- Valence : 감정의 긍정적 또는 부정적 척도를 수치로 나타내는 값
- Labels : 감정을 상세하게 표현하는 라벨 값
- Associations : 해당 감정과 관련된 상황 또는 사건

Kind : 지금의 feeling은 감정인가요? 기분인가요?
우선, 기록할 감정 상태를 두 가지로 분류할 수 있습니다.
=> 특정 순간에 느낀 찰나의 감정 (Emotion)과 하루 혹은 그 이상 전반적으로 느낀 기분 (Mood)으로 분류하게 되죠.
- momentaryEmotion (순간적인 감정) : 특정 사건이나 활동 중에 느꼈던 "일시적인" 감정을 기록
- dailyMood (하루의 기분) : 하루를 되돌아보며, 전반적으로 느낀 추세를 포함한 "지속적인" 감정을 기록
let kind: HKStateOfMind.Kind = .momentaryEmotion
func predicateForStatesOfMind(with kind: HKStateOfMind.Kind) -> NSPredicate

Valence : feeling의 척도를 수치로 표현해보자 (Unpleasant ~ Pleasant)
그다음으로 감정의 긍정적 (Pleasant) 또는 부정적 (Unpleasant)인 척도를 숫자로 표현합니다.
수는 Double형으로 가장 부정적일 때는 -1.0으로, 가장 긍정적일 때는 1.0으로 표현해 연속적인 수치 값으로 나타낼 수 있습니다.
let valence: Double = emojiType.valence
func predicateForStatesOfMind(
withValence valence: Double,
operatorType: NSComparisonPredicate.Operator
) -> NSPredicate
그리고 이 값은 순차적인 수에 따라 분류 (ValenceClassification)가 이루어져 아래와 같은 UI로 표현하는 것도 재밌게 느껴졌습니다.
Custom을 통해 별도의 이모지나 애니메이션을 구현해 볼 수도 있을 것 같네요.
현재 분류는 순차적으로 Very Unpleasant부터 Slightly한 값을 지나, Neutral을 거쳐, 최종 Very Pleasant까지 이루어지고 있네요!

Labels : 감정을 구체적으로 묘사 (describe)해볼까요?
그리고 이제 사용자가 선택할 수 있는 구체적인 감정 또는 기분을 묘사하는 단어를 선택할 수 있도록 합니다.
=> 어떻게 보면, 해당 요소가 사용자의 "감정을 더 명확하고 구체적으로 표현"할 수 있도록 돕는 State of Mind의 핵심 기능으로 볼 수 있죠.
let labels: [HKStateOfMind.Label] = [.happy, .excited]
func predicateForStatesOfMind(with label: HKStateOfMind.Label) -> NSPredicate
HKStateOfMid.Label 열거형에 구현되어 있는 항목을 보면, 정말 다양한 감정 단어가 준비된 것을 확인할 수 있습니다.
특정 단어 하나로만 묘사하는 것이 아니라, 보통 Array로 담아 다양한 표현으로 묘사할 수 있도록 한 것도 흥미로운 부분이네요.

Associations : 그 감정은 어디서부터 비롯된 건가요?
마지막으로, 사용자가 특정 감정이나 기분을 설명했으면 - 그것과 관련된 (그 감정을 야기한 원인이 되겠네요!) 요소를 기록해야 합니다.
Label과 마찬가지로 Array로 담아 여러 감정과 관련된 원인들을 선택할 수 있습니다.
let associations: [HKStateOfMind.Association] = [.work, .friends]
func predicateForStatesOfMind(with association: HKStateOfMind.Association) -> NSPredicate
하나하나의 요소를 다 설명할 수 없으니, 자세한 내용은 HKStateOfMind.Association 문서에서 살펴보도록 하죠!

State of Mind, 어떻게 활용할 수 있는 건데?
세션에서는 기본 일기 앱에서 Mood를 담아, 감정을 기록하는 예시를 대표적으로 보여줍니다.
뿐만 아니라, 직접 <커스텀 감정 기록> 기능을 담은 별도의 멘탈 관리 애플리케이션을 릴리즈해볼 수도 있을 거예요!
기본적인 기능으로는 아이폰 기본 건강 앱과의 연동을 목적으로 해당 API를 사용하게 될 것입니다.
(1) 건강앱에 감정 상태롤 기록하거나, (2) 건강앱으로부터 감정 상태 데이터를 가져오는 Query로 해당 API를 사용하게 된다는 뜻이겠죠?
코드를 간략하게만 살펴봅시다!
새로운 State of Mind 데이터를 생성하고, 건강 앱에 저장하는 코드는 아래와 같이 간단하게 만들 수 있습니다.
지금까지 살펴봤던 HKStateOfMind 클래스를 사용하는 방법이죠.
func createSample(for event: EventModel, emojiType: EmojiType) -> HKStateOfMind {
let kind: HKStateOfMind.Kind = .momentaryEmotion
let valence: Double = emojiType.valence
let label = emojiType.label
let association = event.association
return HKStateOfMind(
date: event.endDate,
kind: kind,
valence: valence,
labels: [label],
associations: [association]
)
}
// Health 앱에 저장
func save(sample: HKSample, healthStore: HKHealthStore) async {
do {
try await healthStore.save(sample)
} catch {
// ...
}
}
또한, HealthKit에서 제공하는 쿼리 조건 (predicate)을 생성해서, 특정 조건에 맞는 State Of Mind 데이터를 필터링할 수도 있습니다.
지금까지 위에서 봤던 HKQuery 클래스를 사용하는 방법이 되겠네요.
let datePredicate = HKQuery.predicateForSamples(
withStart: Date().addingTimeInterval(-7 * 24 * 60 * 60), // 일주일 기준의 시간
end: Date()
)
let labelPredicate = HKQuery.predicateForStatesOfMind(with: .happy)
let associationPredicate = HKQuery.predicateForStatesOfMind(withAssociation: .friends)
let compoundPredicate = NSCompoundPredicate(
andPredicateWithSubpredicates: [datePredicate, labelPredicate, associationPredicate]
)
let stateOfMindPredicate = HKSamplePredicate.stateOfMind(compoundPredicate)
// HealthKit 쿼리 실행
let descriptor = HKSampleQueryDescriptor(
predicates: [stateOfMindPredicate],
sortDescriptors: []
)
do {
let results = try await descriptor.result(for: healthStore)
} catch {
// ...
}
이제 막 생긴 뜨끈뜨끈한 API에, 추가될 여지가 많아 보이는
/ 그렇지만 현대 사회에서 꼭 필요한 것으로 보이는 Mental Health 분야이기에 앞으로의 발전이 어떻게 이루어질지 살펴보는 것도 재밌을 것 같습니다!
오늘 글은 여기서 마무리🍀
Reference
Explore wellbeing APIs in HealthKit - WWDC24 - Videos - Apple Developer
Learn how to incorporate mental health and wellbeing into your app using HealthKit. There are new APIs for State of Mind, as well as for...
developer.apple.com
'Framework, Library' 카테고리의 다른 글
[AVFoundation] iOS에서 텍스트-음성 변환 기능 TTS (Text-to-Speech) 구현하기 (0) | 2025.02.05 |
---|---|
[Speech] iOS에서 음성-텍스트 변환 기능 STT (Speech-To-Text) 구현하기 (0) | 2025.01.31 |
[Share Extension] 다른 앱의 "공유하기" 버튼에 우리 앱을 설정하고 싶다면? (feat. NSExtensionActivationRule) (5) | 2024.10.06 |
[WebKit] WKWebView를 사용해서 앱 사용 중, 웹으로 연결시켜보자 (1) | 2024.02.15 |
[Library] Code Base에서 UI 인스턴스를 직관적으로 만들어보자, Then (0) | 2023.10.17 |