AI 활용 공간/Mind Wellness 앱
Flutter로 정신건강 앱 개발하기: 마인드 웰니스 앱 개발 후기
need-story
2025. 6. 18. 14:25
반응형
🎯 프로젝트 소개
안녕하세요! 오늘은 제가 혼자서 개발한 마인드 웰니스 앱의 개발 과정을 공유하려고 합니다. 이 앱은 단순한 감정 일기를 넘어서 CBT(인지행동치료)와 ACT(수용전념치료) 원리를 활용한 종합적인 정신건강 관리 앱입니다.
앱의 핵심 기능
- 🏠 홈/대시보드: 개인화된 일일 요약과 맞춤형 활동 추천
- 📝 기록 & 도구: 멀티모달 감정 입력과 실시간 CBT/ACT 도구
- 📊 인사이트: 감정 패턴 분석과 트렌드 시각화
- 🤖 AI 친구: 24/7 정서적 지원을 제공하는 AI 챗봇
- 👤 프로필: 성장 경로 관리와 개인 설정
🛠 기술 스택 선택과 이유
Frontend: Flutter + Dart
# 주요 의존성들
flutter_riverpod: ^2.3.6 # 상태 관리
go_router: ^10.0.0 # 라우팅
fl_chart: ^0.63.0 # 데이터 시각화
hive: ^2.2.3 # 로컬 저장소
Flutter를 선택한 이유:
- 크로스 플랫폼 개발로 개발 시간 단축
- 풍부한 UI 컴포넌트와 애니메이션 지원
- 정신건강 앱에 필요한 부드럽고 친근한 UI 구현 가능
Backend: Firebase + Supabase 하이브리드
이 부분이 가장 독특한 선택이었는데요:
// Firebase: 인증과 푸시 알림
firebase_auth: ^5.5.3
firebase_messaging: ^15.1.3
// Supabase: 주요 데이터 저장
supabase_flutter: ^1.10.0
하이브리드 구조를 선택한 이유:
- Firebase: 검증된 인증 시스템과 강력한 푸시 알림
- Supabase: PostgreSQL 기반의 복잡한 데이터 관계 처리와 RLS(Row Level Security)
AI 통합: Gemini + OpenAI
// AI 서비스들
ai_chat_gemini_service.dart
openai_service.dart
emotion_analysis_service.dart
😅 개발 과정에서 마주한 어려움들
1. Firebase와 Supabase 데이터 동기화의 악몽
가장 큰 도전이었습니다. Firebase Auth의 uid와 Supabase의 사용자 데이터를 연결하는 과정에서:
// 이런 식으로 두 서비스를 연결해야 했어요
final currentUser = FirebaseAuth.instance.currentUser;
final userId = currentUser.uid;
// Supabase에서 userId는 text 타입으로 처리
final userData = await AdminSupabase.instance
.from('users')
.select()
.eq('user_id', userId)
.single();
해결 과정:
- 초기에는 UUID 타입 매칭 문제로 며칠을 고생
- 결국 모든 userId를 text 타입으로 통일
2. Clean Architecture 구현의 복잡성
lib/
├── domain/ # 비즈니스 로직
│ ├── entities/
│ ├── repositories/
│ └── usecases/
├── data/ # 데이터 레이어
│ └── models/
├── presentation/ # UI 레이어
│ └── providers/
어려웠던 점:
- 간단한 기능도 여러 레이어를 거쳐야 하는 복잡성
- 초기 설정 시간이 오래 걸림
- 하지만 결과적으로 유지보수가 훨씬 쉬워졌습니다!
3. 감정 데이터의 실시간 분석
// 감정 분석 서비스 구현
class EmotionAnalysisService {
Future<Map<String, dynamic>> analyzeEmotion(String text) async {
// 텍스트에서 감정과 인지 왜곡 패턴을 실시간으로 분석
// NLP 모델과 규칙 기반 분석을 조합
}
}
도전 과제:
- 한국어 감정 분석의 정확도 문제
- 실시간 처리 성능 최적화
- 개인정보 보호를 위한 온디바이스 처리 구현
4. AI 친구 기능의 자연스러운 대화
// AI 채팅 서비스
class AiChatGeminiService {
Future<String> sendMessage(String message, String personality) async {
// CBT/ACT 원리가 자연스럽게 녹아든 응답 생성
// 사용자의 감정 상태를 고려한 맞춤형 응답
}
}
어려웠던 점:
- AI가 전문적이면서도 친근하게 느껴지도록 하는 톤 조절
- 위기 상황 감지와 적절한 대응 로직 구현
- API 비용 최적화
5. 데이터 보안과 프라이버시
정신건강 데이터는 극도로 민감하기 때문에:
-- Supabase RLS 정책 예시
CREATE POLICY "Users can only access their own data"
ON emotion_records FOR ALL
USING (auth.uid()::text = user_id);
보안 조치들:
- Row Level Security (RLS) 필수 적용
- 온디바이스 데이터 암호화
- 최소 권한 원칙 적용
6. 복잡한 상태 관리
Riverpod을 사용했지만 여러 데이터 소스를 동시에 관리하는 것이 복잡했습니다:
// 여러 프로바이더들이 서로 의존하는 복잡한 구조
@riverpod
class HomeProvider extends _$HomeProvider {
// Firebase 인증 상태 + Supabase 데이터 + AI 응답을 모두 관리
}
🚀 성과와 배운 점
기술적 성과
- 오프라인 퍼스트: Hive를 활용한 완벽한 오프라인 지원
- 실시간 분석: 타이핑하는 동안 인지 왜곡 패턴을 실시간으로 감지
- 개인화: 사용자 패턴을 학습하여 맞춤형 도구 추천
- 확장성: Clean Architecture로 새로운 기능 추가가 용이
개발 경험에서 배운 것들
- 기술 스택 선택의 중요성: Firebase + Supabase 조합이 복잡했지만, 각각의 장점을 살릴 수 있었습니다.
- 사용자 중심 설계: 정신건강 앱은 기술보다 사용자 경험이 더 중요하다는 걸 깨달았습니다.
- 점진적 개발: MVP → 베타 → 출시 단계를 거치며 기능을 점진적으로 추가하는 것의 중요성
- 데이터 프라이버시: 민감한 데이터를 다루는 앱에서는 보안이 선택이 아닌 필수
🔮 앞으로의 계획
- 머신러닝 모델 개선: 더 정확한 감정 분석을 위한 온디바이스 ML 모델 도입
- 웨어러블 연동: Apple Watch, Galaxy Watch와의 연동으로 생체 데이터 활용
- 커뮤니티 기능: 익명으로 경험을 공유할 수 있는 안전한 커뮤니티
- 전문가 연결: 필요시 실제 상담사와 연결해주는 기능
마무리
혼자서 개발한 프로젝트였지만, 정말 많은 것을 배울 수 있었습니다. 특히 기술적인 도전뿐만 아니라 정신건강이라는 민감한 영역에서 어떻게 기술이 도움이 될 수 있는지 고민하는 시간이었습니다.
Flutter의 강력함과 Firebase/Supabase의 조합, 그리고 AI 기술의 활용까지... 현대적인 앱 개발의 복잡성을 몸소 체험할 수 있었습니다.
앞으로도 사용자의 정신건강에 실질적으로 도움이 되는 앱으로 발전시켜 나가겠습니다! 🌱
다음 시간에는 개인 개발자가 앱 아이디어 부터 출시까지의 여정에 대해 간략하게 설명드리겠습니다.
개발 과정에 대해 궁금한 점이 있으시다면 언제든 댓글로 남겨주세요! 💬
반응형