๊ฑธ์ ์, ๊ฑฐ๋ฆฌ, ์นผ๋ก๋ฆฌ, ์ฌ๋ฐ์, ์๋ฉด์ ๊ฑด๊ฐ ๋ฐ ์์ ์ฑ์ ์ํด ์ฌ์ฉ์์ ํ๋ซํผ(Android์ Android Health Connect, iOS์ Apple HealthKit)์์ ๊ฐ์ ธ์์ ธ์ผ ํ๋ฉฐ โ ํ๋์ ๊น๋ํ๊ณ ์ค๋ณต ์ ๊ฑฐ๋ ์ผ์ผ ํ๋กํ๋ก ์ ์๋์ด์ผ ํฉ๋๋ค. ๋ API ๊ฐ์๋ ์ ์ฌ์ ์ด ๊ฑฐ์ ์์ต๋๋ค: ๋ณ๋์ ์ฝ๊ธฐ ๋ฉ์ปค๋์ฆ, ๋ค๋ฅธ ๊ถํ ๋ถ์ฌ ์ฒด๊ณ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ. ์ ํฌ๋ ์ด๋ค์ ํ๋์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๋ชจ๋ฐ์ผ ๋๊ธฐํ ๋ ์ด์ด๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
๋น๋ฉด ๊ณผ์
- ์ด๋ค ๊ฒ๋ ๋์ํ์ง ์๋ ๋ ๊ฐ์ ๋ค์ดํฐ๋ธ API. Apple HealthKit์ ์ฝ๋ฐฑ์ ํตํด ์ผ๋ณ ์ง๊ณ๋ฅผ ๋ฐํํ๊ณ ; Health Connect๋ ํ๋ถํ ์์ค ๋ฉํ๋ฐ์ดํฐ์ ํจ๊ป ์์์ ์ด๊ณ ํ์ด์ง๋ก ๋๋ ์ํ์ ๋ฐํํฉ๋๋ค. ๋์ผํ ๊ฐ๋ ์ด์ง๋ง ์์ ํ ๋ค๋ฅธ ํํ โ ๊ทธ๋ฆฌ๊ณ ์ฑ์ ๋ ๋ค ํ๋์ ์คํค๋ง๋ก ์ ๊ทํํด์ผ ํ์ต๋๋ค.
- ์ด์ค ๊ณ์ฐ์ด ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ํด๋ํฐ, ์ค๋งํธ์์น, ํ์ฌ ์ฑ ๋ชจ๋ ๋์ผํ 8,000 ๊ฑธ์์ ๋ณด๊ณ ํ ์ ์์ต๋๋ค. ๋จ์ํ ํฉ์ฐํ๋ฉด ๋ชจ๋ ์งํ๊ฐ ๊ณผ์ฅ๋ฉ๋๋ค. ์ฑ์ ์ค๋ณต๋๋ ์์ค๋ฅผ ์ธ์ํ๊ณ ๊ฐ ์ค์ ํ๋์ ํ ๋ฒ๋ง ๊ณ์ฐํด์ผ ํ์ต๋๋ค.
- ๋ฐฐํฐ๋ฆฌ์ ๋คํธ์ํฌ๋ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ ๋๊ฐ๋ฅผ ์น๋ฅผ ์ ์์ต๋๋ค. ๊ฑด๊ฐ ๋ฐ์ดํฐ๋ ํ๋ฃจ ์ข ์ผ ๋ณ๊ฒฝ๋์ง๋ง, ๋งค ๋๊ธฐํ๋ง๋ค ์ ์ฒด ๊ธฐ๋ก์ ์ฝ์ผ๋ฉด ๋ฐฐํฐ๋ฆฌ๊ฐ ์๋ชจ๋๊ณ ์ ๋ฃฐ๋ฌ ์ฐ๊ฒฐ์ด ํฌํ ์ํ๊ฐ ๋ฉ๋๋ค. ๋๊ธฐํ ์ฃผ๊ธฐ๋ ์ค์๊ฐ์ผ๋ก ๋๊ปด์ง๋ฉด์๋ ๊ฐ๋ฒผ์์ผ ํ์ต๋๋ค.
๊ถํ์ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์์ญ ๊ฐ์ง ๋ฐ์ดํฐ ์ ํ, ๋ ๊ฐ์ง ๊ถํ ๋ชจ๋ธ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฝ๊ธฐ ์ ํ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ถ ๋ฒ์๋ ํ์ฉํ์ง๋ง ๋ค๋ฅธ ๋ฒ์๋ ํ์ฉํ์ง ์๋ ์ฌ์ฉ์ โ ์ด ๋ชจ๋ ๊ฒ์ ์ฑ์ ํ๋ฆ์ ์ค๋จ์ํค์ง ์๊ณ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์๋ฃจ์
์ ํฌ๋ 3๋จ๊ณ ๋๊ธฐํ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค: ์์ ๋ค์ดํฐ๋ธ ๋ ์ด์ด๊ฐ ๊ฐ ํ๋ซํผ์ API๋ฅผ ์ฝ๊ณ , ์จ๋๋ฐ์ด์ค ์ ๊ทํ ๋ ์ด์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์ ๊ฑฐํ๊ณ ์ผ๋ณ ์์ฝ์ผ๋ก ๋กค์ ํ๋ฉฐ, ๋ฐฑ์๋๋ ์ด๋ฅผ ์ ์ฅํ๊ณ ๋จ์ผ ์ ๋ขฐํ ์ ์๋ ์์ฅ์ผ๋ก ์กฐ์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์์ ์ํ์ ์ ์กํ์ง ์๊ณ โ ๊น๋ํ๊ณ ์๊ฐ๋ ๋ณด์ ๋ ์ผ๋ณ ๋กค์ ์ ์ ์กํฉ๋๋ค.

์ํคํ ์ฒ
- iOS๋ react-native-health๋ฅผ ํตํด Apple HealthKit์ ์ฝ๊ณ ; Android๋ react-native-health-connect๋ฅผ ํตํด Health Connect๋ฅผ ์ฝ์ต๋๋ค.
- ์จ๋๋ฐ์ด์ค ์ ๊ทํ๋ ๋ ํ๋ซํผ์ ์ถ๋ ฅ์ ํ๋์ ์คํค๋ง๋ก ๋ณํํ๊ณ ํด๋ํฐ์ ๋ ๋๊ธฐ ์ ์ ์ค๋ณต์ ์ ๊ฑฐํฉ๋๋ค.
- ๋๊ธฐํ ํธ๋ฆฌ๊ฑฐ โ ์ฒซ ์คํ ์ 30์ผ ๊ธฐ๋ก, ์ดํ 10๋ถ ๊ฐ๊ฒฉ ๋ฐ ์ฑ ์ฌ๊ฐ ์๋ง๋ค ๊ฒฝ๋ 1์ผ ์ฆ๋ถ ์ฝ๊ธฐ.
- ์ ์ก โ ์ ๊ทํ๋ ์ผ์ผ ๋กค์ ์ ๋ฉ์ธ ์๋ฒ์ /user-health/system-activity์ POST๋๋ฉฐ, ์ด๋ (์ฌ์ฉ์ ID + ์๊ฐ๋์ ํจ๊ป) ํฌ์ค ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ๋ฌ๋ฉ๋๋ค.
- ์์์ฑ โ ๊ฐ ์์ค/์ผ์ HealthSystemAggregate๋ก ๋ฉฑ๋ฑ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค; ๊ทธ๋ฌ๋ฉด MongoDB change stream์ด ์ด๋ฅผ ์ผ๋ณ HealthLedger๋ก ์กฐ์ ํฉ๋๋ค.
๋ค์ดํฐ๋ธ HealthKit ๋ฐ Health Connect ๋ชจ๋์ ์ฌ์ฉํ Expo / React Native ๊ด๋ฆฌํ ์ํฌํ๋ก์ฐ.
์ฃผ์ ๊ธฐ๋ฅ
- ๋ API๋ฅผ ์ํ ๋จ์ผ ์ ๊ทํ ๊ณ์ฝ. ํ๋ซํผ๋ณ ๋ฆฌ๋๋ ๋จ์ผ formatHealthData ๋จ๊ณ๋ฅผ ๊ณต๊ธํ์ฌ ์์ค์ ๊ด๊ณ์์ด ๋์ผํ ํํ๋ฅผ ๋ด๋ณด๋ ๋๋ค โ ๋ฐ๋ผ์ ๋ฐฑ์๋์ UI๋ iOS ๋ Android์ ๋ฐ๋ผ ๋ถ๊ธฐ๋์ง ์์ต๋๋ค.
2. ๊ธฐ๊ธฐ ๋ด ์ต๋๊ฐ ๊ธฐ๋ฐ ์ค๋ณต ์ ๊ฑฐ. ๊ฐ ์์ค ๋ด์์ ํ๋ฃจ์ ์ธก์ ๊ฐ์ ํฉ์ฐ๋ฉ๋๋ค; ๊ทธ๋ฐ ๋ค์ ์ผ๋ณ ๊ฐ์ ์์ค ์ ๋ฐ์ ๊ฑธ์น Math.max()์
๋๋ค (์นผ๋ก๋ฆฌ๋ source|deviceType์ผ๋ก ํค ์ง์ ๋จ). ๋ฐ๋ผ์ ํ ๊ธฐ๊ธฐ์์ ์ฌ๋ฌ ์ธก์ ๊ฐ์ด ๋์ ๋๋ ๋์, ๊ฐ์ ๋ ์ ๋ณด๊ณ ํ๋ ์๊ณ์ ์ ํ๋ ์ด์ค์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค:
// Sum readings within each source, then take the max ACROSS sources dateSourceMap[date][source] += entry.count; const totalSteps = Math.ceil(Math.max(...Object.values(dateSourceMap[date]))); |
3.ํ๋ซํผ๋ณ ์ฌ๋ฐ๋ฅธ ์ฝ๊ธฐ ์ ๋ต. Health Connect ์ฝ๊ธฐ๋ pageToken ๋ฃจํ (ํ์ด์ง๋น 1,000๊ฐ ๊ธฐ๋ก)๋ก ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง๋๋ค; HealthKit์ ์ผ๋ณ ์ง๊ณ๋ ์ผ๋ณ๋ก ๋ฐ๋ณต๋ฉ๋๋ค. ๊ฐ ํน์ด์ฌํญ์ ์ฑ์ ๋๋จธ์ง ๋ถ๋ถ์๋ ๋ณด์ด์ง ์๋ ์์ฒด ๋ฆฌ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
4. ๋ฐฐํฐ๋ฆฌ๋ฅผ ๊ณ ๋ คํ ๋๊ธฐํ ์ฃผ๊ธฐ. ์ ์ฒด 30์ผ ๋ฐฑํ์ ํ ๋ฒ๋ง ์คํ๋๋ฉฐ (์ฒซ ํธ์ถ ํ๋๊ทธ๋ก ๋ณดํธ๋จ); ๊ทธ ํ์๋ ๋ชจ๋ ๋๊ธฐํ๊ฐ ํ๋ฃจ์น ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ต๋๋ค โ ์ ๋ฃฐ๋ฌ์์ ๋น ๋ฅด๊ณ , ์ ๋ ฅ ์๋ชจ๊ฐ ์ ์ต๋๋ค.
5. ์๊ฐ๋ ๋ณด์ ๋ ์ผ์ผ ๊ทธ๋ฃนํ. ์ํ์ ์ฌ์ฉ์์ ์๊ฐ๋์ ๋ฐ๋ผ YYYY-MM-DD ํค๋ก ๋ถ๋ฅ๋๋ฏ๋ก, ์๋ฒ ์์น์ ๊ด๊ณ์์ด ์คํ 11์ ์ด๋์ด ์ฌ๋ฐ๋ฅธ ๋ ์ง์ ํฌํจ๋ฉ๋๋ค.
6. ๋ฉฑ๋ฑ์ ์ธ ๋ฐฑ์๋ ์ฐ๊ธฐ. ๊ฐ ๋กค์ ์ (userId, deviceId, source, date)๋ฅผ ๊ธฐ์ค์ผ๋ก upsert๋ฉ๋๋ค โ ๋์ผํ ๋ ์ง๋ฅผ ๋ค์ ์ ์กํ๋ ๊ฒ์ no-op์ด ๋์ด ์ฌ์๋ ๋ฐ ์ค๋ณต ๋๊ธฐํ๋ฅผ ์์ ํ๊ฒ ๋ง๋ญ๋๋ค.
7. ์ ์งํ ์ฑ๋ฅ ์ ํ ์ฒ๋ฆฌ. ๋๋ฝ๋ ๊ถํ, ๋น ์ฝ๊ธฐ, Health Connect rate-limit ์ค๋ฅ๋ ๊น๋ํ๊ฒ ํฌ์ฐฉ๋๊ณ ํ์๋ฉ๋๋ค โ ๋น ๋ ์ง๋ก ์ธํด ๋๊ธฐํ๊ฐ ์ค๋จ๋์ง ์์ผ๋ฉฐ, ์ฌ์ฉ์์๊ฒ๋ ์กฐ์ฉํ ์คํจ ๋์ ๋ช ํํ ํ๋กฌํํธ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
๊ฒฐ๊ณผ
- iOS ๋ฐ Android ์ ๋ฐ์ ๊ฑธ์ณ ๋จ์ผํ๊ณ ์ผ๊ด๋ ๊ฑด๊ฐ ํ๋กํ โ ํ๋ซํผ ์ฐจ์ด๊ฐ ์ฑ์ ๋๋จธ์ง ๋ถ๋ถ์์๋ ๋ณด์ด์ง ์์ต๋๋ค.
- ์ค๋ณต๋๋ ๊ธฐ๊ธฐ/์ฑ ์์ค๋ ์ค๋ณต ์ ๊ฑฐ๋์ด, ๊ฑธ์ ์์ ์นผ๋ก๋ฆฌ๊ฐ ๋ถํ๋ ค์ง ํฉ๊ณ ๋์ ํ์ค์ ๋ฐ์ํฉ๋๋ค.
- ๊ฒฝ๋ ์ฆ๋ถ ๋๊ธฐํ๋ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์๋ชจํ๊ฑฐ๋ ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํฉ๋๋ค.
์๊ฐ๋ ๋ณด์ ๋ ๋ฉฑ๋ฑ์ ์ฐ๊ธฐ๋ ๋ชจ๋ ์งํ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ ์ง์ ๊ธฐ๋ก๋๊ณ , ์ฌ์๋๊ฐ ๊ธฐ๋ก์ ์์์ํค์ง ์์์ ์๋ฏธํฉ๋๋ค.
๊ธฐ์ ์คํ
React Native (Expo) ยท react-native-health (HealthKit) ยท react-native-health-connect ยท NestJS ยท MongoDB ยท MongoDB Change Streams ยท moment-timezone

