MindLog

AI 기반 감정 케어 다이어리

당신의 일기를 분석하여 감정 상태를 파악하고,
따뜻한 위로의 메시지와 맞춤형 행동 지침을 제공합니다.

주요 기능

📝

일기 작성 및 저장

로컬 데이터베이스(SQLite)에 안전하게 저장되며, 날짜별로 일기를 관리하고 조회할 수 있습니다.

🤖

AI 감정 분석

Groq API (Llama 3.3)를 활용하여 실시간에 가까운 감정 분석을 제공합니다. 캐릭터 선택에 따라 공감 톤이 달라집니다.

📊

감정 통계 대시보드

감정 추이 차트, 감정 정원(🌱→🌻), 키워드 태그 클라우드로 나의 감정 패턴을 시각화합니다.

💬

맞춤형 추천

AI가 분석한 감정 상태에 기반하여 공감 메시지와 맞춤형 행동 지침을 제안합니다.

🔒

프라이버시 보호

모든 일기 데이터는 로컬 기기에만 저장되어 개인 정보가 안전하게 보호됩니다.

📱

반응형 UI

320dp~600dp+ 다양한 화면 크기에 최적화된 반응형 디자인으로 모든 기기에서 편안하게 사용할 수 있습니다.

🔐

비밀일기

4자리 PIN + SHA-256 암호화로 민감한 일기를 안전하게 보호합니다. 인증된 세션에서만 접근 가능하며 통계에서 완전히 제외됩니다.

최근 개선

v1.4.53까지의 개선 사항을 소개합니다. Self-Encouragement 시간대별 메시지 기능 완성(timeAware 모드 구현 + UI), dead code 제거에 의한 코드 품질 향상, 테스트 커버리지 확대 등이 이루어졌습니다.

Feature

시간대별 맞춤 응원 메시지 — timeAware 모드 완성 (v1.4.53)

Self-Encouragement 시스템에 시간대 기반 메시지 필터링을 구현했습니다. MessageRotationMode.timeAware 선택 시 morning(5-11h)/afternoon(12-17h)/evening(18-4h)로 분류하여 시간대에 맞는 메시지를 우선 전달합니다. 매칭 메시지 없을 시 전체 풀 폴백을 포함한 안전장치도 설계했습니다. 설정 UI에 '시간대 맞춤 선택' RadioListTile을 추가하고, 메시지 입력 다이얼로그에 ChoiceChip 4종(전체/아침/오후/저녁) 시간대 태깅 UI를 구현했습니다.

Code Quality

Dead Code 제거 + 단일 책임 통일 (v1.4.53)

메시지 선택 로직이 UseCase와 Service 두 곳에 중복되어 있던 구조적 문제를 해결했습니다. GetNextSelfEncouragementMessageUseCase + 테스트 총 485줄을 삭제하고, NotificationSettingsService를 유일한 메시지 선택 경로로 통일했습니다. 이로써 emotionAware/timeAware 로직 변경 시 단일 수정 지점만 관리하면 되는 구조가 확립됐습니다.

Testing

테스트 커버리지 확대 — selectMessage + Widget 37건 (v1.4.53)

selectMessage() 단위 테스트 6케이스(시간대 필터링 경계값, emotionAware 가중치 검증)와 MessageInputDialog 위젯 테스트 17건(timeCategory 선택/해제, 수정 모드 프리로드, record 반환값 검증)을 추가했습니다. 전체 테스트 1,633건 통과, flutter analyze 0 errors를 유지합니다.

UX

공감 메시지 truncation 제거 — StatefulWidget → StatelessWidget (v1.4.52)

EmpathyMessage가 항상 SingleChildScrollView 안에 렌더링됨에도 maxLines: 4 + AnimatedCrossFade + TextPainter 측정으로 내부에서 truncation을 유발했습니다. 렌더링 컨텍스트를 분석해 불필요한 상태 관리를 전면 제거하고 StatelessWidget으로 전환했습니다. 코드 90줄 → 62줄, HapticFeedback·AppDurations import 삭제.

Bug Fix

Cheer Me 알림 개인화 복합 버그 수정 (v1.4.50)

4개 독립 원인이 동시에 작용한 복합 버그를 체계적으로 분석하고 수정했습니다. (D) 정규식 [,의은을이]?(?:[,의은을이]|에게|께)? alternation. (C) getRandomReminderTitle() userName 인자 전파 누락. (B) valueOrNull AsyncLoading → await .future. (A) hasPlaceholder 검사로 bake-in 리터럴 강제 재스케줄.

스크린샷

MindLog 온보딩 화면

온보딩

MindLog 일기 목록 화면

일기 목록

MindLog 일기 작성 화면

일기 작성

MindLog 마음 달력 화면

마음 달력

MindLog 감정 추이 차트

감정 추이

MindLog 키워드 분석 화면

키워드 분석

MindLog AI 캐릭터 선택 화면

AI 캐릭터

MindLog 설정 화면

설정

기술 스택

Framework Flutter
Language Dart
State Management Riverpod
Local DB SQLite
AI API Groq (Llama 3.3 + Vision)
Charts fl_chart
Architecture Clean Architecture

지금 시작해보세요

MindLog와 함께 나의 감정을 기록하고 이해해보세요.