갤럭시 워치 기반 24시간 실시간 심리 모니터링 시스템
- 프로젝트명: HAND - Have A Nice Day
- 기간: 2025.10 ~ 2025.11 (7주)
- 팀: 7명
HAND는 갤럭시 워치를 활용하여 사용자의 심리 상태를 24시간 모니터링하고, 실시간으로 이상 징후를 감지하여 적절한 완화법을 제안하는 서비스입니다.
- 🔍 실시간 이상치 감지
- 📊 매일 자정 오늘의 점수 계산 (0-100점)
- 💆 완화법 제안 (심호흡, 안전지대 연습)
- 👥 그룹 관리 (관리자 대시보드)
| 이름 | 역할 |
|---|---|
| 이희준 | 팀장, 인프라 및 IoT |
| 남여경 | 프론트엔드 및 디자인 |
| 김동현 | 프론트엔드 |
| 김성민 | 백엔드 |
| 진성범 | 백엔드 |
| 김민선 | IoT 및 프론트엔드 |
| 왕주영 | AI 총괄 |
- Java 25
- Spring Boot 3.x
- Spring Cloud Gateway
- Gradle
- MySQL, MongoDB
- Android (Kotlin)
- Wear OS (Galaxy Watch)
- Python 3.10, FastAPI
- Weaviate (Vector DB)
- KcELECTRA (감정 분류 모델)
- GMS Embedding API (GPT-4 Embedding)
- MLflow (실험 관리)
- Jenkins
- Docker
- Nginx
- Prometheus + Grafana
사용자가 작성한 하루 다이어리 텍스트를 기반으로 감정 점수와 6가지 감정 확률을 분석합니다.
- 모델: KcELECTRA 기반 커스텀 감정 분류 모델
- 감정 라벨: 기쁨 / 당황 / 분노 / 불안 / 상처 / 슬픔
- 감정별 확률 계산 후 가중치를 적용하여 0~100 감정 점수 산출
- 전처리: URL 제거, 이모지 제거, 텍스트 정규화 등
다이어리 텍스트를 두 형태로 요약해 제공합니다.
✔️ 짧은 요약 (20글자 내, ~한 날로 끝남)
- 사용자에게 직접 보여주는 요약
- 사건 중심으로 감정 톤을 극도로 압축
✔️ 긴 요약 (길이 제한 없음)
- 내부 분석용 요약
- 사건/감정/맥락을 모두 담은 상세 요약
- 보고서 생성과 조언 생성을 위한 기반 데이터로 사용
다음 데이터를 종합해 전문가 스타일의 주간 분석 리포트를 생성합니다.
- 입력: 다이어리 요약들(long/short), 감정 점수 변화, Galaxy Watch 기반 생체 데이터(baseline, anomalies), 사용자 정보(age, gender, job 등)
- 출력:
- 감정 패턴 분석
- 생체 스트레스 지표 해석
- 감정–생체 반응 상관성 분석
- 개인 특성 기반 코멘트
- 주의 필요한 부분 / 회복 신호
- 항목별 글자 수 조건을 맞춘 정제된 보고서
서버는 사용자 및 관리자(팀장)에게 각각 맞춤 조언을 제공합니다.
✔️ 일간 조언 (daily_advice)
- 오늘의 다이어리 내용을 기반으로 2줄 내외 조언 생성
✔️ 개인용 주간 조언 (private_advice)
- 주간 보고서 + 유사 상담 기록을 기반으로 조언
✔️ 관리자용 주간 조언 (manager_advice)
- 팀원의 상태 보고서 기반으로 관리자만 할 수 있는 톤의 조언을 추천
Weaviate 벡터 DB를 활용하여 과거 상담 기록에서 유사한 상황을 탐색합니다.
- Hybrid Search (BM25 + Vector)
- 입력: 감정 요약 및 사용자 정보(나이, 직업, 질병력 등), 일일 다이어리 요약 합본
- 단일 상담/멀티턴 상담 모두 검색
- 조언 생성 시 참고 자료로 활용
- GMS Embedding API 사용 (GPT-3 Embedding)
- 텍스트 → 벡터 변환
- 조언/요약/리포트 등 모든 텍스트를 vector로 저장해 RAG 활용
다음 목적의 벡터를 저장/조회합니다.
- 조언 데이터 저장 (SingleCounsel, MultiCounsel)
- 저장 조건: 생성된 조언이 8 종류의 평가 기준 점수 평균 0.7 이상일 때만 저장
조언의 품질을 자동으로 평가하여 0~1 스코어로 측정합니다.
포함된 평가 지표:
- Answer Relevancy (답변 관련성)
- Faithfulness (왜곡 없음)
- Context Relevancy (문맥 적합도)
- Empathy (공감도)
- Safety (안전성)
- Actionability (실행 가능성)
- ARES 7개 항목 (helpfulness, coherence, groundedness, safety 등)
모든 평가는 GMS 모델로 수행하고 MLflow에 자동 기록됩니다.
- 모든 조언 평가 metric을 MLflow에 기록
- 실험 관리 / 모델 품질 추적
- mlruns 디렉토리 자동 관리
시스템 아키텍처 상세도:
exec/Architecture.png
S13P31A106/
├── backend/ # Spring Boot Backend
│ ├── src/main/
│ │ ├── java/com/finger/hand_backend/
│ │ └── resources/
│ │ └── application.yml
│ ├── Dockerfile
│ └── build.gradle
│
├── frontend/
│ ├── app/ # Android 앱
│ │ ├── src/main/java/com/hand/hand/
│ │ ├── google-services.json
│ │ └── build.gradle.kts
│ └── wear/ # Wear OS 앱
│ └── src/main/kotlin/com/hand/wear/
│
├── ai/ # AI Server (FastAPI)
│ ├── FastAPI/
│ │ ├── app/
│ │ │ ├── api/
│ │ │ │ ├── route.py # 엔드포인트 라우팅
│ │ │ │ └── weav.py # Weaviate 연결 모듈
│ │ │ ├── core/
│ │ │ │ └── vector_embedding.py # GPT Embedding 3 + GMS 요청
│ │ │ ├── models/
│ │ │ │ └── schemas.py # Pydantic 스키마
│ │ │ └── services/
│ │ │ ├── advice.py # 관리자 조언 생성
│ │ │ ├── emotion_classify.py# 감정 분석
│ │ │ ├── report.py # 주간 보고서 생성
│ │ │ └── summary.py # 요약 기능 모듈
│ │ ├── main.py # FastAPI 앱 진입점
│ │ └── model_loader.py # KcELECTRA 모델 로더
│ │
│ ├── Classifier_Model/ # 감정 분류 모델 (KcELECTRA)
│ │ ├── config.json
│ │ ├── model.safetensors # 감정 분석 핵심 파라미터
│ │ ├── tokenizer.json # 토큰화 핵심 파일
│ │ └── README.md
│ │
│ ├── Pretraining/ # 사전학습 및 파인튜닝
│ │ └── KcELECTRA_shortsentence_finetuning.ipynb
│ │
│ ├── Quantization/ # 모델 경량화/양자화 실험
│ │ └── KcELECTRA_Quantization.ipynb
│ │
│ ├── vector_db_settings/ # Weaviate 벡터DB 설정
│ │ ├── db_setting.py
│ │ ├── docker-compose.yml
│ │ ├── insert.ipynb
│ │ ├── total_kor_counsel_bot.jsonl
│ │ └── total_kor_multiturn_counsel_bot.jsonl
│ │
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── mlflow.db # MLflow 로컬 DB
│ └── requirements.txt
│
├── Jenkinsfile # CI/CD 파이프라인
└── README.md
Backend (Spring Boot)
- Java: OpenJDK 25 (Eclipse Temurin)
- Build Tool: Gradle 9.2.0
- Spring Boot: 3.5.7
- WAS: Embedded Tomcat (Spring Boot)
- Port: 8080
- Context Path:
/api/v1
AI Server (FastAPI)
- Python: 3.10-slim
- Framework: FastAPI 0.120.0
- ASGI Server: Uvicorn 0.38.0
- Port: 8000
Frontend (Android)
- Kotlin: JVM Target 11
- Android SDK:
- compileSdk: 36
- minSdk: 24
- targetSdk: 36
- Gradle: 8.x (Kotlin DSL)
Wear OS
- Wear OS API: 34+
- Health Services: 1.1.0
Backend 환경변수 (.env)
# Database (MySQL)
DB_HOST=localhost
DB_PORT=3306
DB_NAME=hand_db
DB_USERNAME=your_db_user
DB_PASSWORD=your_db_password
# MongoDB
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DB=hand_mongo
MONGO_USERNAME=your_mongo_user
MONGO_PASSWORD=your_mongo_password
# GMS API (SSAFY OpenAI)
GMS_API_KEY=your_gms_api_keyAI Server 환경변수 (.env)
# Weaviate Vector DB
WEAVIATE_HOST=weaviate
WEAVIATE_PORT=8080
WEAVIATE_GRPC_PORT=50051
# CORS
CORS_ORIGINS=https://gatewaytohand.store
# OpenAI API (Optional - for LangChain)
OPENAI_API_KEY=your_openai_api_key
# LangSmith (Optional - for monitoring)
LANGSMITH_API_KEY=your_langsmith_api_keyFrontend 환경변수 (build.gradle.kts)
// GMS API 설정
buildConfigField("String", "GMS_BASE_URL", "\"https://gms.ssafy.io/gmsapi/api.openai.com/\"")
buildConfigField("String", "GMS_API_KEY", "\"your_gms_api_key\"")Jenkins 환경변수
# Docker Registry
REGISTRY_PORT=5000
REGISTRY_PRIVATE_IP=private_ip
REGISTRY_PUBLIC_IP=public_ip
# Server IPs
BACKEND_SERVER_IP=server2_ip
AI_SERVER_IP=server3_ip
# GitLab
GITLAB_WEBHOOK_TOKEN=your_webhook_tokenBackend 배포
- Docker Multi-stage Build 사용 (build + runtime 분리)
- FCM Service Account 키 필요 (
firebase-service-account.json) - Jenkins에서 자동 빌드/배포 (dev 브랜치 push 시)
- Health Check:
/actuator/health
AI Server 배포
- Weaviate Vector DB와 함께 docker-compose로 배포
- 모델 로딩 시 Warm-up 수행 (약 10-15초 소요)
- GPU 사용 시 CUDA 11.2+ 필요 (torch==2.5.1)
- Health Check: Weaviate 서비스 정상 작동 확인 후 시작
Frontend 배포
- Firebase App Distribution으로 APK 배포
google-services.json파일 필요 (Firebase 설정)- Release Notes 자동 생성 (커밋 해시, 빌드 번호 포함)
Backend 설정 파일
backend/src/main/resources/application.yml- MySQL, MongoDB 접속 정보
- JWT Secret Key
- GMS API 설정
- AI Server URL 설정
환경 변수로 관리되는 민감 정보
# application.yml에서 환경변수 참조
spring:
datasource:
url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
data:
mongodb:
uri: mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/${MONGO_DB}
jwt:
secret: "ZkR9mS2QvT7yP0aU1nW4eX6rL8oC5jB3hK9tV2pY0xF7dE1sZq" # 배포 시 변경 필요AI Server 설정
ai/docker-compose.yml: Weaviate 및 FastAPI 서비스 정의ai/FastAPI/main.py: CORS 설정
Frontend 설정
frontend/app/google-services.json: Firebase 프로젝트 설정 (Git 미포함)frontend/app/build.gradle.kts: GMS API 키 설정
Firebase Cloud Messaging (FCM)
- 용도: 푸시 알림 (이상치 감지 시 알림 전송)
- 필요 파일:
google-services.json(Android 앱)firebase-service-account.json(Backend)
- 설정 방법:
- Firebase Console에서 프로젝트 생성
- Android 앱 등록
google-services.json다운로드 →frontend/app/위치- 서비스 계정 키 생성 → Backend
src/main/resources/위치
GMS API (SSAFY OpenAI Proxy)
- 용도: STT (Speech-to-Text) - 음성 일기 작성
- Base URL:
https://gms.ssafy.io/gmsapi/api.openai.com/v1/chat/completions - API Key: SSAFY에서 발급받은 팀별 API Key 사용
- 사용 위치:
- Backend:
application.yml→gms.api.key - Frontend:
build.gradle.kts→GMS_API_KEY
- Backend:
Weaviate Vector Database
- 용도: RAG (Retrieval Augmented Generation) - AI 조언 생성
- Version: 1.27.10
- Port:
- HTTP: 8080
- gRPC: 50051
- 설정:
ai/docker-compose.yml
Google Play Services (Wearable)
- 용도: Android 앱 ↔ Wear OS 통신
- Library:
com.google.android.gms:play-services-wearable:18.0.0 - Protocol: Message API, Data API
프로젝트 제출 시
exec폴더에 포함 예정
hand_db_dump.sql(MySQL)hand_mongo_dump/(MongoDB)
ERD는 별도 파일로 제공:
exec/ERD.png
주요 테이블
- users: 사용자 정보
- organizations: 그룹(조직) 정보
- measurements: 생체 데이터 (심박수, 스트레스 등)
- anomaly_events: 이상치 감지 기록
- relief_histories: 완화법 수행 기록
- diaries: 일기 데이터
- sleep_records: 수면 데이터
MongoDB Collections
- diary_summaries: AI 일기 요약
- weekly_reports: 주간 리포트
- manager_advice: 관리자 조언
별도 문서로 제공 예정 (
exec/시연_시나리오.txt)
© 2025 FINGER Team. All rights reserved.


