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로 새로운 기능 추가가 용이

개발 경험에서 배운 것들

  1. 기술 스택 선택의 중요성: Firebase + Supabase 조합이 복잡했지만, 각각의 장점을 살릴 수 있었습니다.
  2. 사용자 중심 설계: 정신건강 앱은 기술보다 사용자 경험이 더 중요하다는 걸 깨달았습니다.
  3. 점진적 개발: MVP → 베타 → 출시 단계를 거치며 기능을 점진적으로 추가하는 것의 중요성
  4. 데이터 프라이버시: 민감한 데이터를 다루는 앱에서는 보안이 선택이 아닌 필수

🔮 앞으로의 계획

  • 머신러닝 모델 개선: 더 정확한 감정 분석을 위한 온디바이스 ML 모델 도입
  • 웨어러블 연동: Apple Watch, Galaxy Watch와의 연동으로 생체 데이터 활용
  • 커뮤니티 기능: 익명으로 경험을 공유할 수 있는 안전한 커뮤니티
  • 전문가 연결: 필요시 실제 상담사와 연결해주는 기능

마인드웰니스 메인화면 스샷
마인드웰니스 메인화면

마무리

혼자서 개발한 프로젝트였지만, 정말 많은 것을 배울 수 있었습니다. 특히 기술적인 도전뿐만 아니라 정신건강이라는 민감한 영역에서 어떻게 기술이 도움이 될 수 있는지 고민하는 시간이었습니다.

Flutter의 강력함과 Firebase/Supabase의 조합, 그리고 AI 기술의 활용까지... 현대적인 앱 개발의 복잡성을 몸소 체험할 수 있었습니다.

앞으로도 사용자의 정신건강에 실질적으로 도움이 되는 앱으로 발전시켜 나가겠습니다! 🌱

다음 시간에는 개인 개발자가 앱 아이디어 부터 출시까지의 여정에 대해 간략하게 설명드리겠습니다.


개발 과정에 대해 궁금한 점이 있으시다면 언제든 댓글로 남겨주세요! 💬

반응형