์ค์๊ฐ ์น์บ ์์ธ ์ธ์์ ํตํด ๊ฑฐ๋ถ๋ชฉ๊ณผ ๊ฐ์ ์๋ชป๋ ์์ธ๋ฅผ ๊ต์ ํ๊ณ ์ฌ์ฉ์์๊ฒ ํต๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ฐ์คํฌํ ์ ํ๋ฆฌ์ผ์ด์
- ์๋น์ค ๋ค์ด๋ก๋ ํ์ด์ง: https://choihooo.github.io/bugi-download/
- ๋ฌธ์ ์ธ์: ์ฅ์๊ฐ ์ปดํจํฐ ์ฌ์ฉ์ผ๋ก ์ธํด ๋ฌด์์์ ์ผ๋ก ์์ธ๊ฐ ํํธ๋ฌ์ ธ ๊ฑฐ๋ถ๋ชฉ, ์ด๊นจ ๋น๋์นญ ๋ฑ์ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฌ์ฉ์๊ฐ ๋ง์ต๋๋ค.
- ํต์ฌ ํด๊ฒฐ ์ ๋ต:
- ์น์บ ์ ํตํด ์ฌ์ฉ์์ ์์ธ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๊ณ ์๊ฐ์ ์ผ๋ก ํผ๋๋ฐฑํฉ๋๋ค.
- ์๋ชป๋ ์์ธ๊ฐ ๊ฐ์ง๋๋ฉด ์๋ฆผ์ ๋ณด๋ด ์ฆ๊ฐ์ ์ธ ๊ต์ ์ ์ ๋ํฉ๋๋ค.
- ์ธ์ ๋ณ ์์ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๊ณ ํต๊ณ ๋์๋ณด๋๋ฅผ ์ ๊ณตํ์ฌ ์ฅ๊ธฐ์ ์ธ ์ต๊ด ๊ฐ์ ์ ๋์ต๋๋ค.
- ํ๋ก ํธ์๋ ๊ธฐ์ ํฌ์ธํธ:
@mediapipe/tasks-vision์ ํ์ฉํ์ฌ ์น์บ ์์์์ ์ค์๊ฐ์ผ๋ก ์ ์ฒด ํคํฌ์ธํธ๋ฅผ ์ถ์ถํ๊ณ ์์ธ๋ฅผ ๋ถ์ํฉ๋๋ค.Zustand๋ฅผ ์ฌ์ฉํด ์ธ์ , ์๋ฆผ, ์นด๋ฉ๋ผ ๋ฑ ๋ณต์กํ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.Recharts๋ฅผ ์ด์ฉํด ์ฌ์ฉ์์ ์์ธ ์ ์, ํจํด ๋ฑ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ์ ๊ณตํฉ๋๋ค.Electron์ IPC ํต์ ์ ํ์ฉํ์ฌ ๋ฉ์ธ ์๋์ฐ์ ์์ ฏ ๊ฐ์ ์ํ๋ฅผ ๋๊ธฐํํฉ๋๋ค.
-
์ค์๊ฐ ์์ธ ๋ถ์ ๋ฐ ์์ ฏ
- ์ค๋ช : ์น์บ ์ ํตํด ์ฌ์ฉ์์ ์์ธ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๊ณ , MediaPipe๋ฅผ ํ์ฉํด ์ ์ฒด ํคํฌ์ธํธ๋ฅผ ์ถ์ถํฉ๋๋ค. ๋ฉ์ธ ํ๋ฉด๊ณผ ๋ฐ์คํฌํ ์์ ฏ์ ํตํด ํ์ฌ ์์ธ ์ํ(๊ฑฐ๋ถ๋ชฉ/๊ธฐ๋ฆฐ)๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ ์ธ์ ์ ์ ์ดํ ์ ์์ต๋๋ค. ์์ ฏ์ ํญ์ ์์ ํ์๋๋ฉฐ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ธฐ์ ํฌ์ธํธ:
react-webcam,@mediapipe/tasks-vision, ElectronBrowserWindow,PostureClassifier - ์ฃผ์ ํน์ง:
- PI(Posture Index) ๊ณ์ฐ์ ํตํ ์ ๋์ ์์ธ ํ๊ฐ
- EMA(Exponential Moving Average) ์ค๋ฌด๋ฉ์ผ๋ก ๋ ธ์ด์ฆ ์ ๊ฑฐ
- ScoreProcessor๋ฅผ ํตํ ๋ค๋จ๊ณ ์ค๋ฌด๋ฉ (Moving Average โ EMA(30) โ EMA(70))
- ํ์คํ ๋ฆฌ์์ค ๋ก์ง์ผ๋ก ์ฑํฐ๋ง ๋ฐฉ์ง (enter_bad: 1.2, exit_bad: 0.8)
- ์ ๋ฉด์ฑ ๊ฒ์ฌ(roll, centerRatio)๋ก ์ธก์ ์ ๋ขฐ๋ ๋ณด์ฅ
- ์์ ฏ ๋ ๋ฆฝ ๋์: ๋ฉ์ธ ์ฐฝ์ด ์์ด๋ ์์ ฏ๋ง์ผ๋ก ์์ธ ํ์ ๊ฐ๋ฅ
- ์ค๋งํธ ๋๊ธฐํ: ๋ฉ์ธ ์ฐฝ์ด ํ์ฑํ๋์ด ์์ผ๋ฉด ์์ ฏ์ ํ์ ์ ํ์ง ์๊ณ ๋๊ธฐํ๋ง ์ํ
-
์บ๋ฆฌ๋ธ๋ ์ด์ ์์คํ
- ์ค๋ช : ์ฌ์ฉ์ ๊ฐ์ธ์ ์ ์ ์์ธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ ํ๋ ์บ๋ฆฌ๋ธ๋ ์ด์ ๊ธฐ๋ฅ์ ๋๋ค. ์ธก์ ์ค ๋ฐ๊ธฐ, ์์ธ ์์ ์ฑ ๋ฑ์ ๊ฒ์ฌํ์ฌ ์ ๋ขฐํ ์ ์๋ ๊ธฐ์ค๊ฐ์ ํ๋ณดํฉ๋๋ค.
- ๊ธฐ์ ํฌ์ธํธ:
trimmedStats(์ํ 5% ์ ์ฌ ํ๊ท ๋ฐ ํ์คํธ์ฐจ),errorChecks(๋ฐ๊ธฐ/์์ ์ฑ ๊ฒ์ฆ)
-
ํต๊ณ ๋์๋ณด๋
- ์ค๋ช : ์ผ๋ณ, ์ฃผ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ธ ์ ์ ๋ณํ, ์ฃผ์ ์์ธ ํจํด, ์ถ์๋ฅ , ํ๊ท ์์ธ ์ ์, ๋ ๋ฒจ ์งํ๋ ๋ฑ์ ์๊ฐ์ ์ผ๋ก ๋ถ์ํฉ๋๋ค. Recharts๋ฅผ ํ์ฉํ ๋ค์ํ ์ฐจํธ๋ก ์ฌ์ฉ์์ ์ฅ๊ธฐ์ ์ธ ์์ธ ๊ฐ์ ์ถ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ํฌ์ธํธ:
TanStack Query(์๋ฒ ๋ฐ์ดํฐ ์บ์ฑ ๋ฐ ๋๊ธฐํ),Recharts(์ฐจํธ ์๊ฐํ) - ์ฃผ์ ํจ๋:
- ํ๊ท ์์ธ ์ ์ ๊ทธ๋ํ (์๊ฐ๋๋ณ ์ถ์ด)
- ์์ธ ํจํด ๋ถ์ (๊ฑฐ๋ถ๋ชฉ/๊ธฐ๋ฆฐ ๋น์จ)
- ์ถ์๋ฅ ๋ฐ ์ฐ์ ์ถ์ ์ผ์
- ๋ ๋ฒจ ์งํ๋ ๋ฐ ๋ฌ์ฑ๋ฅ
-
์์ธ ๊ต์ ์๋ฆผ
- ์ค๋ช : ๊ฑฐ๋ถ๋ชฉ์ด๋ ๋น๋์นญ ์์ธ๊ฐ ์ผ์ ์๊ฐ ์ด์ ์ง์๋๋ฉด ๋ฐ์คํฌํ ์๋ฆผ์ ๋ณด๋ด ์ฌ์ฉ์๊ฐ ์ธ์งํ๊ณ ๋ฐ๋ก์ก์ ์ ์๋๋ก ๋์ต๋๋ค. ์๋ฆผ ๊ฐ๋์ ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ํฌ์ธํธ: Electron
NotificationAPI,useNotificationSchedulerํ ,Zustand(์๋ฆผ ์ํ ๊ด๋ฆฌ)
-
์ธ์ ๊ด๋ฆฌ
- ์ค๋ช : ์์ธ ์ธก์ ์ธ์ ์ ์์, ์ผ์์ ์ง, ์ฌ๊ฐ, ์ข ๋ฃํ ์ ์์ต๋๋ค. ์ธ์ ์ค ์์ง๋ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์ ์ฅ๋๋ฉฐ, ์ธ์ ์ข ๋ฃ ์ ๋ฆฌํฌํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๊ธฐ์ ํฌ์ธํธ:
useAutoMetricsSender(์๋ ๋ฉํธ๋ฆญ ์ ์ก),useSessionCleanup(์ธ์ ์ ๋ฆฌ)
- Framework:
Electron,React - Language:
TypeScript - State Management:
Zustand,TanStack Query - Styling:
Tailwind CSS - Build/Bundle:
Vite - Pose Detection:
@mediapipe/tasks-vision
- Version Control:
Git, GitHub - CI:
GitHub Actions - Package Manager:
pnpm - Linting & Formatting:
Biome - Form Validation:
react-hook-form,zod - Animation:
framer-motion - Routing:
react-router-dom
- ํ๋ก์ ํธ ํ๋ฒ:
.specify/memory/constitution.md - Renderer๋ Node/Electron API์ ์ง์ ์ ๊ทผํ์ง ์๊ณ , preload
contextBridge๊ณ์ฝ์ ํตํด์๋ง ์์คํ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค. - Renderer ๊ตฌ์กฐ๋ FSD ๋ ์ด์ด ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ, ํด๋ผ์ด์ธํธ ์ํ๋
Zustand, ์๋ฒ ์ํ๋TanStack Query๋ก ๋ถ๋ฆฌํฉ๋๋ค. - ๋จธ์ง ๊ธฐ์ค์
Biome check,TypeScript typecheck,build๊ฒ์ฆ ํต๊ณผ์ ๋๋ค. - ํ๊ทธ ๋ฆด๋ฆฌ์ฆ๋
vX.Y.Z๊ท์น์ ์ฌ์ฉํ๋ฉฐ macOS/Windows ๋น๋์ ์ ๋ฐ์ดํธ ๋ฉํ๋ฐ์ดํฐ ์ ๋ก๋๊ฐ ๋ชจ๋ ์๋ฃ๋์ด์ผ ํฉ๋๋ค.
ํ์ฌ ์ฑ์ ๋ถ์ ์ด๋ฒคํธ๋ Renderer์์ GA SDK๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ , ์๋ ๊ฒฝ๋ก๋ก ์ ์ก๋ฉ๋๋ค.
renderer logEvent -> preload contextBridge -> ipc -> main -> GA4 Measurement Protocol
GA4_MEASUREMENT_ID=G-XXXXXXXXXX
GA4_API_SECRET=YOUR_API_SECRET
GA4_DEBUG_MP=trueGA4_API_SECRET์ Main ํ๋ก์ธ์ค์์๋ง ์ฌ์ฉ๋๋ฉฐ Renderer ๋ฒ๋ค์ ํฌํจ๋์ง ์์ต๋๋ค.- ์๋
page_view/URL ๊ธฐ๋ฐ ์ถ์ ์ ์ฌ์ฉํ์ง ์๊ณ , ํผ๋/ํต์ฌ ํ๋ ์ด๋ฒคํธ๋ง ์ ์กํฉ๋๋ค.
GA4_DEBUG_MP=true์ผ ๋:mp/collect์ ์ก ์debug_mode๊ฐ ํฌํจ๋์ด DebugView ํ์ธ ๊ฐ๋ฅdebug/mp/collect๊ฒ์ฆ ์๋ต์ด ๋ฉ์ธ ํฐ๋ฏธ๋์ ์ถ๋ ฅ๋จ
Electron ํ๋ก์ ํธ๋ ์ผ๋ฐ์ ์ผ๋ก Main Process, Preload Scripts, Renderer Process ์ธ ๊ฐ์ง ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ Vite๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ๋ก์ธ์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋น๋ํ๊ณ , TypeScript์ React๋ฅผ ํ์ฉํ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฐธ๊ณ ๋ณด์ผ๋ฌํ๋ ์ดํธ:
- electron-vite-react - Electron Vite React ํ ํ๋ฆฟ
- electron-vite - Vite ๊ธฐ๋ฐ Electron ๋ณด์ผ๋ฌํ๋ ์ดํธ
- electron-react-boilerplate - Webpack ๊ธฐ๋ฐ Electron + React ๋ณด์ผ๋ฌํ๋ ์ดํธ
- vite-electron-builder - Vite + Electron Builder ๋ณด์ผ๋ฌํ๋ ์ดํธ
src/
โโโ main/ # Electron ๋ฉ์ธ ํ๋ก์ธ์ค
โ โโโ src/
โ โโโ index.ts # IPC ํธ๋ค๋ฌ ๋ฐ ์ฑ ์ด๊ธฐํ
โ โโโ mainWindow.ts # ๋ฉ์ธ ์๋์ฐ ์์ฑ ๋ฐ ๊ด๋ฆฌ
โ โโโ widgetWindow.ts # ์์ ฏ ์๋์ฐ ์์ฑ ๋ฐ ๊ด๋ฆฌ
โ โโโ notificationHandlers.ts # ์๋ฆผ ๊ด๋ จ ํธ๋ค๋ฌ
โโโ preload/ # Electron ํ๋ฆฌ๋ก๋ ์คํฌ๋ฆฝํธ
โ โโโ src/
โ โโโ index.ts # Context Bridge API ๋
ธ์ถ
โโโ renderer/ # React ์ ํ๋ฆฌ์ผ์ด์
(UI)
โโโ src/
โโโ api/ # API ์์ฒญ ๊ด๋ จ ํ
(TanStack Query)
โ โโโ dashboard/ # ๋์๋ณด๋ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ
โ โโโ session/ # ์ธ์
๊ด๋ฆฌ ๋ฎคํ
์ด์
โ โโโ login/ # ์ธ์ฆ ๊ด๋ จ
โโโ assets/ # ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ์ ์ ์์
โโโ entities/ # ๋น์ฆ๋์ค ์ํฐํฐ (FSD ์ํคํ
์ฒ)
โ โโโ posture/ # ์์ธ ๋ถ์ ์ํฐํฐ
โ โโโ lib/
โ โโโ PostureClassifier.ts # ์์ธ ๋ถ๋ฅ ์์ง
โ โโโ ScoreProcessor.ts # ์ ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
โ โโโ calculations.ts # PI ๊ณ์ฐ, EMA ์ค๋ฌด๋ฉ
โ โโโ errorChecks.ts # ์บ๋ฆฌ๋ธ๋ ์ด์
๊ฒ์ฆ
โ โโโ Button/ # ๋ฒํผ ์ปดํฌ๋ํธ
โ โโโ Modal/ # ๋ชจ๋ฌ ์ปดํฌ๋ํธ
โ โโโ ...
โโโ hooks/ # ์ปค์คํ
ํ
โ โโโ useNotificationScheduler.ts # ์๋ฆผ ์ค์ผ์ค๋ง
โ โโโ useAutoMetricsSender.ts # ์๋ ๋ฉํธ๋ฆญ ์ ์ก
โ โโโ useWidget.ts # ์์ ฏ ์ํ ๊ด๋ฆฌ
โโโ layout/ # ํ์ด์ง ๋ ์ด์์ ์ปดํฌ๋ํธ
โโโ pages/ # ๋ผ์ฐํ
๋จ์ ํ์ด์ง ์ปดํฌ๋ํธ
โ โโโ Main/ # ๋ฉ์ธ ๋์๋ณด๋ ํ์ด์ง
โ โโโ Widget/ # ์์ ฏ ํ์ด์ง
โ โโโ Calibration/ # ์บ๋ฆฌ๋ธ๋ ์ด์
ํ์ด์ง
โ โโโ ...
โโโ store/ # Zustand ์ ์ญ ์คํ ์ด
โ โโโ usePostureStore.ts # ์์ธ ์ํ ๊ด๋ฆฌ
โ โโโ useCameraStore.ts # ์นด๋ฉ๋ผ ์ํ ๊ด๋ฆฌ
โ โโโ useNotificationStore.ts # ์๋ฆผ ์ค์ ๊ด๋ฆฌ
โโโ styles/ # ์ ์ญ ์คํ์ผ ๋ฐ Tailwind ์ค์
โโโ types/ # ๊ณต์ฉ ํ์
์ ์
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์- ์ปดํฌ๋ํธ ์ค๊ณ: ํ์ด์ง(Pages)๊ฐ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ํ์นญ์ ๋ด๋นํ๊ณ , ์ปดํฌ๋ํธ(Components)๋ UI ํํ์ ์ง์คํ๋ ๊ตฌ์กฐ๋ฅผ ์งํฅํฉ๋๋ค.
pose-detectionํด๋์๋ ์์ธ ์ธ์ ๊ด๋ จ ํต์ฌ ๋ก์ง์ด ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. - ๋์์ธ ์์คํ
:
Button,Modal,TextField,ToggleSwitch๋ฑ ํต์ฌ UI๋ฅผ ๊ณตํต ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ต๋๋ค.clsx์tailwind-merge๋ฅผ ํ์ฉํด ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ๊ด๋ฆฌํฉ๋๋ค. - ์ํ ๊ด๋ฆฌ ์ ๋ต:
Zustand๋ก ํด๋ผ์ด์ธํธ ์ํ(์์ธ, ์นด๋ฉ๋ผ, ์๋ฆผ ์ค์ ) ๊ด๋ฆฌTanStack Query๋ก ์๋ฒ ์ํ ์บ์ฑ ๋ฐ ๋๊ธฐํ- ์์ ฏ๊ณผ ๋ฉ์ธ ์๋์ฐ ๊ฐ ๋๊ธฐํ๋
localStorage์storage์ด๋ฒคํธ ํ์ฉ
# 1. ์์กด์ฑ ์ค์น
pnpm install
# 2. ๊ฐ๋ฐ ์๋ฒ ์คํ (๋ฉ์ธ + ๋ ๋๋ฌ ๋์ ์คํ)
pnpm dev
# 3. ํ๋ก๋์
๋น๋
pnpm build
# 4. ํ๋ก๋์
๋ชจ๋๋ก ์คํ
pnpm start:prod
# 5. ํ๋ซํผ๋ณ ๋น๋
pnpm build:mac # macOS ๋น๋
pnpm build:win # Windows ๋น๋
pnpm build:all # ๋ชจ๋ ํ๋ซํผ ๋น๋- ๊ธฐ๋ณธ ๋ฐฐํฌ ๊ฒฝ๋ก๋
mainPR merge ->.github/workflows/auto-release.yml->vX.Y.Ztag push ->Electron Release/Release Notes์์์ ๋๋ค. - ๋ฒ์ ์ฆ๊ฐ๋ PR label
release:major,release:minor,release:patch์ค ์ ํํ ํ๋๋ก๋ง ๊ฒฐ์ ๋ฉ๋๋ค. - ์๋ ๋ฆด๋ฆฌ์ฆ ์์ ์
lint,typecheck,build์ฒดํฌ๊ฐ ๋ชจ๋ ์ฑ๊ณตํด์ผ ํฉ๋๋ค. package.json๋ฒ์ ๊ณผ Git tag๋ ๊ฐ์ release prepare ์ปค๋ฐ์์ ํจ๊ป ๋๊ธฐํ๋ฉ๋๋ค.- ์๋
workflow_dispatch๋ฆด๋ฆฌ์ฆ๋auto_release_recovery,approved_hotfix,operator_intervention์์ธ ์ฌ์ ๊ฐ ์์ ๋๋ง ์ฌ์ฉํฉ๋๋ค.
- Auto Release summary์์ HEAD SHA, ๊ณ์ฐ๋ ๋ฒ์ , duplicate guard ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- Electron Release summary์์
mac_release,win_release,updater_metadata๋จ๊ณ๋ฅผ ํ์ธํฉ๋๋ค. partial_platform_release๋๋updater_metadata_incomplete๊ฐ ๋์ค๋ฉด ๋ง์ง๋ง ์์ ํ๊ทธ ๊ธฐ์ค์ผ๋ก rollback ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.- ๋ฆด๋ฆฌ์ฆ ํ๊ท ๊ฒ์ฆ์
pnpm run release:validate๋ก ์ํํฉ๋๋ค.
-
๊ธฐ์ ์ ๋์ ๊ณผ์ :
- ์ค์๊ฐ ์์ ์ฒ๋ฆฌ ์ฑ๋ฅ: ์ ์ฌ์ ์ปดํจํฐ์์๋ ๋ถ๋๋ฝ๊ฒ ์๋ํ๋๋ก ์น์บ ์์ ๋ถ์ ๊ณผ์ ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํ์ต๋๋ค.
- ๋ค์ค ์๋์ฐ ์ํ ๊ด๋ฆฌ: Electron์ ๋ฉ์ธ ์๋์ฐ์ ์์ ฏ ์๋์ฐ ๊ฐ์ ์ํ(์ธ์ , ์๊ฐ ๋ฑ)๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ๋๊ธฐํํ๋ ๊ฒ์ด ๋ณต์กํ์ต๋๋ค. ํนํ ๋ฉ์ธ ์ฐฝ๊ณผ ์์ ฏ์ด ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ ์ ์ํํ๋ฉด ์ํ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ: macOS์ Windows ํ๊ฒฝ ๋ชจ๋์์ ์์ ์ ์ผ๋ก ๋น๋๋๊ณ ์คํ๋๋๋ก
electron-builder์ค์ ์ ๊ตฌ์ฑํ์ต๋๋ค.
-
ํด๊ฒฐ ๊ณผ์ :
- ์ฑ๋ฅ ์ต์ ํ:
- MediaPipe์
detectForVideo๋ฅผ ํ๋ ์๋ณ๋ก ํธ์ถํ์ฌ ์ค๋ณต ์ฒ๋ฆฌ ๋ฐฉ์ง ScoreProcessor์ ๋ค๋จ๊ณ ์ค๋ฌด๋ฉ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ ธ์ด์ฆ ์ ๊ฑฐ (Moving Average โ EMA(30) โ EMA(70))- ํ์คํ ๋ฆฌ์์ค ๋ก์ง์ผ๋ก ์ฑํฐ๋ง ๋ฐฉ์งํ์ฌ ์์ ์ ์ธ ์ํ ์ ํ
- ์ ์ ํด๋จํ(-10 ~ 40)์ผ๋ก ์ด์์น ์ ๊ฑฐ
- ๋ค์ค ์๋์ฐ ๋๊ธฐํ:
- ๋ฉ์ธ ํ๋ก์ธ์ค๋ฅผ ์ค์ ํ๋ธ๋ก ์ผ์
ipcMain๊ณผipcRenderer๋ฅผ ํตํด ์์ ฏ ์ฐฝ ์ด๊ธฐ/๋ซ๊ธฐ ์ ์ด - ์์ ฏ๊ณผ ๋ฉ์ธ ์๋์ฐ ๊ฐ ์์ธ ์ํ ๋๊ธฐํ๋
localStorage์storage์ด๋ฒคํธ ํ์ฉ (IPC ๋์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ณ ์์ ์ ์ผ๋ก ๊ตฌํ) usePostureSyncWithLocalStorageํ ์ผ๋ก ์์ ฏ์์ ๋ฉ์ธ ์ฐฝ์ ์ํ ๋ณ๊ฒฝ ๊ฐ์ง- ์ค๋งํธ ํ์ ์ ๋ต: ๋ฉ์ธ ์ฐฝ์ด ํ์ฑํ๋์ด ์์ผ๋ฉด ์์ ฏ์ ํ์ ์ ํ์ง ์๊ณ ๋ฉ์ธ ์ฐฝ์ ๊ฒฐ๊ณผ๋ง ๋๊ธฐํ๋ฐ์. ๋ฉ์ธ ์ฐฝ์ด ์์ผ๋ฉด ์์ ฏ์ด ๋ ๋ฆฝ์ ์ผ๋ก ํ์ ์ํ
- ๋ฉ์ธ ์ฐฝ ํ์ฑํ ์ํ๋ localStorage์ ํ์์คํฌํ๋ก ์ถ์ (2์ด ์ด๋ด ์ ๋ฐ์ดํธ๊ฐ ์์ผ๋ฉด ๋นํ์ฑํ๋ก ๊ฐ์ฃผ)
- ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ:
- GitHub Actions๋ฅผ ์ด์ฉํด ๊ฐ๊ธฐ ๋ค๋ฅธ OS ํ๊ฒฝ์ ๋น๋๋ฅผ ์๋ํ
entitlements.mac.plist์ ์นด๋ฉ๋ผ/๋ง์ดํฌ ๊ถํ ๋ช ์electron-builder์ค์ ์ผ๋ก macOS (Intel/Apple Silicon) ๋ฐ Windows ๋น๋ ์ง์
| ํ๋กํ | ์ญํ | ์ด๋ฆ | GitHub |
|---|---|---|---|
![]() |
Frontend | ์ตํธ | @choihooo |
![]() |
Frontend | ์ดํ์ | @hwanseok1014 |
![]() |
Backend | ์๋ํ | @son-daehyeon |



