Skip to content

예측 탭의 구현을 완성합니다. - #13

Merged
snughnu merged 19 commits into
devfrom
feat/Prediction
Jul 15, 2026
Merged

예측 탭의 구현을 완성합니다.#13
snughnu merged 19 commits into
devfrom
feat/Prediction

Conversation

@snughnu

@snughnu snughnu commented Jul 15, 2026

Copy link
Copy Markdown
Owner

Situation

예측 탭은 원래 CoreML 기반 온디바이스 학습 모델을 사용자가 직접 생성/교체/삭제하는 구조로 설계되어 있었습니다. 하지만 CoreML 도입 과정에서 iOS에서 실제로 사용 가능한 학습 방식(Updatable Neural Network)이 Python 도구 체인을 필요로 하는 등 프로젝트 규모에 비해 과도하게 무거워졌고, 실제 구현해보니 데이터가 적은 가계부 특성상 정확도가 불안정했습니다. 또한 카테고리별 예측 차트에서 막대가 왜곡되어 그려지거나 겹쳐 보이는 등 여러 렌더링 버그가 있었고, 설정탭에는 데이터를 초기화할 방법이 없었습니다.

Task

  • CoreML 의존을 걷어내고, 통계 기반 예측만으로도 신뢰할 수 있는 구조로 재설계한다
  • "모델을 여러 개 만들어 관리한다"는 복잡한 개념을 사용자가 이해하기 쉬운 형태로 단순화한다
  • 예측 계산 로직 자체의 정확도(우연한 지출을 패턴으로 오인하지 않도록)를 개선한다
  • 카테고리 차트의 시각적 버그를 수정한다
  • 설정탭에서 전체 데이터를 초기화할 수 있게 한다

Action

  • AI/CoreML 관련 타입·파일을 전부 제거하고 Prediction 네이밍으로 통일, 인사이트(이상지출/예고/미기록 감지) 기능도 함께 제거
  • PredictionStrategy 프로토콜과 다중 구현체 구조를 걷어내고, 통계 계산만 담당하는 StatisticsPredictor 구체 클래스로 단순화
  • "모델 생성/교체/삭제" 다중 레코드 구조를 "단일 레코드를 매번 재계산해 덮어쓰는" 구조로 전환 — PredictionModel이 계산 결과(dailyPredictions/categoryPredictions)를 직접 저장하고, recalculate() 하나로 생성과 갱신을 모두 처리
  • predictDaily의 기준을 weekOfMonth(매달 경계가 흔들리는 값)에서 dayOfMonth(정기결제 패턴) + weekday(습관성 소비 패턴)로 교체하고, 표본 수·변동계수 검증을 추가해 1회성 우연한 지출을 패턴으로 오인하지 않도록 함
  • CategoryPredictionCardViewBarMark 렌더링 로직을 세 차례 반복 검증하며 수정: 고정 최소 길이(1000)로 인한 비율 왜곡 제거, 0원 예측값의 막대/라벨이 실제 막대와 겹쳐 보이던 문제 수정, 값이 전혀 없는 카테고리가 빈 행으로 노출되던 문제 수정
  • 설정탭에 "전체 초기화" 섹션을 추가하고, ExpenseRepositoryProtocol.deleteAll() / PredictionRepositoryProtocol.deleteModel()을 새로 정의해 지출·카테고리·예측을 한 번에 초기화하도록 연결
  • PredictionModel 스키마 변경 시 SwiftData 마이그레이션이 조용히 실패해 데이터가 유실되는 위험을 인지할 수 있도록 SceneDelegate에 로깅 추가

Result

  • 예측 탭이 CoreML 의존 없이 통계 계산만으로 동작하는 단순하고 예측 가능한 구조가 됨
  • 사용자는 "모델 생성/교체" 같은 개념을 몰라도 "다시 계산하기" 버튼 하나로 예측을 최신화할 수 있음
  • 데이터가 부족해도 계산이 막히지 않고(0원 예측으로 처리), 소량의 우연한 지출이 확정적인 패턴으로 잘못 예측되는 문제가 줄어듦
  • 카테고리 차트가 실제 금액 비율을 정직하게 반영하고, 의미 없는 빈 카테고리 행이 사라짐
  • 설정탭에서 전체 데이터를 한 번에 초기화할 수 있어 배포 전 테스트 및 사용자 경험이 개선됨

@snughnu snughnu self-assigned this Jul 15, 2026
@snughnu snughnu added the feat 기능을 구현/수정합니다. label Jul 15, 2026
@snughnu
snughnu merged commit b309fb0 into dev Jul 15, 2026
1 check passed
@snughnu
snughnu deleted the feat/Prediction branch July 15, 2026 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 기능을 구현/수정합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant