Graduation Project

Calorie Cutter

Kotlin 기반 Android 운동 관리 앱 (졸업작품)

로그인 화면
메인 캘린더
홈 화면
운동 리스트
운동 기록하기
칼로리 기록
커뮤니티
운동 통계
📅 기간
2024.08 - 2025.06
👥 구성
5인 팀 프로젝트 (졸업작품)
👤 역할
기획 / 개발 전담
🔧 주요 기술
Java, Android, Firebase, WorkManager

프로젝트 소개

졸업작품으로 개발한 Android Native(Java) 운동 관리 앱입니다.

운동 기록 및 캘린더 관리, 루틴 추천, 운동 라이브러리·리뷰, 커뮤니티(일정 공유·자유게시판), 마이페이지 등 피트니스 앱에 필요한 전반적인 기능을 Firebase 기반으로 구현했습니다.

총 237개 파일, 42개 Java 클래스로 구성되었으며 MPAndroidChart를 활용해 운동 통계를 시각화하고, WorkManager로 백그라운드 알림 기능을 구현했습니다.

담당 기능

📢 팀장 / 발표

  • 팀장으로서 일정 관리 및 역할 분배
  • 최종 발표 담당

📋 운동 루틴

  • 운동 목표에 따른 루틴 추천 기능 구현
  • 루틴 등록 및 관리
  • 루틴 수정 기능 구현

📚 운동 라이브러리

  • 부위별 운동 라이브러리 목록 조회
  • 운동별 상세 정보 및 리뷰 작성 기능

👥 커뮤니티

  • 일정 공유 게시판 (운동 일정 공유 및 참여)
  • 자유게시판 (게시글 작성·조회·댓글)
  • Firebase Firestore 기반 실시간 데이터 동기화

기술적 도전

WorkManager 백그라운드 알림 구현

앱을 48시간 이상 사용하지 않으면 백그라운드에서 알림을 보내는 기능을 WorkManager로 구현했습니다. 앱 종료 후에도 Android 시스템이 작업을 보장해주는 WorkManager를 활용하여, 마지막 사용 시각을 SharedPreferences에 저장하고 PeriodicWorkRequest로 주기적으로 체크하는 방식으로 처리했습니다.

Firebase Firestore · RealtimeDB 병행 사용

실시간으로 빠르게 동기화가 필요한 커뮤니티 피드는 Firebase RealtimeDB를 사용하고, 구조화된 문서 저장이 필요한 운동 기록·사용자 프로필은 Firestore로 분리하여 관리했습니다. 두 DB의 특성을 파악하고 적재적소에 활용하는 설계 경험을 쌓았습니다.

MPAndroidChart 통계 시각화

Firestore에서 가져온 운동 기록 데이터를 날짜별로 집계하여 MPAndroidChart의 BarChart · LineChart로 시각화했습니다. 데이터 가공 로직을 ViewModel에서 처리하여 UI와 분리했습니다.

리팩토링

v1 · Java+Kotlin 혼합 v2 · 100% Kotlin 졸업작품 제출 후 언어 통일 및 구조 개선을 위해 전면 리팩토링을 진행했습니다. Claude Code를 활용하여 Java 클래스의 Kotlin 변환 및 구조 개선 작업을 수행했습니다.
🔤 언어 통일 (Java+Kotlin 혼합 → 완전 Kotlin)

Java 9개 + Kotlin 40개가 혼재하여 파일마다 문법이 달라 유지보수가 불편했음

모든 클래스를 Kotlin 66개로 통일, data class·람다·확장함수 등 Kotlin 문법을 적극 활용

📦 패키지 구조 개선
Before (7개)
try2/
calendarui2/
information/
noticeboard/
routine/
notification/
After (11개)
auth/
model/
repository/
diet/
calendarui2/
information/
noticeboard/
routine/
🏗️ Repository 패턴 중앙화

Firebase 쿼리 로직이 각 Fragment/Activity에 분산되어 중복 코드 다수 존재

repository/ 패키지로 집중 — PostRepository, UserRepository, WorkoutRepository, FollowRepository, RoutineRepository 등 8개 Repository

♻️ 추상 클래스로 중복 제거

GeneralBoardFragmentScheduleBoardFragment가 게시글 로드·검색·UI 코드를 각각 중복으로 보유

BaseBoardFragment 추상 클래스로 공통 로직 통합, 각 Fragment는 category만 오버라이드하여 상속

🍽️ 식단 관리 기능 추가

운동 기록만 존재, 칼로리 섭취 관리 기능 없음

diet/ 패키지 신규 추가 — 아침/점심/저녁/간식 식단 기록, 칼로리 목표 대비 진행률 링 차트(DietAddActivity)

🔒 보안 취약점 제거

회원 비밀번호가 Firebase에 평문(plain text)으로 저장되어 있어 보안상 심각한 취약점이 존재했음

Firebase Auth를 통한 인증 방식으로 전환하여 비밀번호 평문 저장 로직을 완전히 제거, 직접적인 비밀번호 저장 없이 인증 처리

👤 회원 / 마이페이지 UI 개선

프로필 이미지 업로드 후 UI 즉시 반영이 없었고, 운동 목표 및 개인정보 관리 화면 구성이 미흡했음

Firebase Storage 업로드 후 프로필 이미지 즉시 반영, 운동 목표 및 개인정보 관리 화면 UI 개선, WorkManager 48시간 미사용 알림 안정화

🔧 코드 품질 및 안정성 개선

Handler에 Looper 미지정, onDestroy에서 콜백 미제거 → 메모리 누수 가능성, 로그인 상태 재확인 없이 스플래시 후 로그인 화면 항상 표시

Handler(Looper.getMainLooper()) 명시 + onDestroy에서 removeCallbacksAndMessages 호출, 이미 로그인된 사용자는 메인 화면으로 자동 이동

트러블슈팅

문제

WorkManager 알림이 특정 기기에서 동작하지 않음

원인

Android 배터리 최적화 설정으로 인해 백그라운드 작업이 시스템에 의해 강제 종료되는 경우 발생

해결

배터리 최적화 예외 권한 요청 안내 다이얼로그를 추가하고, WorkManager의 재시도 정책(BackoffPolicy)을 설정하여 재시도 시 알림이 전송되도록 처리

한계 & 개선점

현재

Firebase 무료 플랜(Spark)으로 운영 중이라 동시 접속자 수 및 저장 용량에 제한이 있음

개선

Spring Boot 백엔드 서버를 별도로 구축하고 MySQL로 전환하면 확장성과 비용 효율성 개선 가능

현재

운동 루틴 추천이 단순 조건 분기 로직으로 구현되어 개인화가 부족함

개선

사용자 운동 기록 데이터를 기반으로 머신러닝 추천 알고리즘을 도입하면 개인화된 루틴 제공 가능

기술 스택

Java 17 Android Native AndroidX Material 3 Firebase Auth Firebase Firestore Firebase RealtimeDB Firebase Storage Retrofit2 OkHttp3 Glide MPAndroidChart WorkManager