습관관리, 사용자 경험을 한 단계 위로 (개발 일지)

오늘은 기존의 습관 관리 앱을 더욱 똑똑하고 사용자 친화적으로 만들기 위한 대규모 개선 작업을 진행했습니다. 사용자의 작은 피드백에서 시작된 아이디어들이 어떻게 실제 코드로 구현되고, 그 과정에서 어떤 기술적 문제들을 해결했는지 공유하고자 합니다.
오늘의 핵심 개선 사항 요약
- 🎨 **UI/UX 개선**: 아이콘과 요일 선택 UI를 더 명확하고 직관적으로 개선.
- ⚙️ **핵심 기능 구현**: '요일 선택'과 '시간 선택'이라는 두 가지 핵심 기능을 새롭게 구현하고, 데이터베이스부터 UI까지 앱의 모든 계층을 수정.
- 🔧 **리팩토링 및 안정성 확보**: 여러 번의 오류와 수정을 거치며, 코드에 남아있던 버그를 잡고 하드코딩된 문자열을 제거하여 코드의 품질과 안정성을 크게 향상.
1. 작은 디테일에서 시작된 UI 개선
아이콘(Icon) 선택 강조
가장 먼저, 사용자가 선택한 아이콘을 명확하게 보여주기 위해 기존의 UI를 개선했습니다. 단순히 배경색만 바꾸는 것에서 더 나아가, 아이콘 자체의 색상(tint)도 함께 변경하여 시각적 피드백을 강화했습니다.
- 선택 시: 배경은
primaryContainer, 아이콘 색상은onPrimaryContainer - 미선택 시: 배경은
surfaceVariant, 아이콘 색상은onSurfaceVariant
이 작은 변화만으로도 사용자는 자신이 어떤 아이콘을 선택했는지 훨씬 명확하게 인지할 수 있게 되었습니다.
2. 핵심 기능 추가: 더 똑똑해진 습관 설정
요일 선택 기능 구현 (주 3회 → 월,수,금)
"주 3회"와 같이 애매한 설정 대신, 사용자가 직접 "월, 수, 금"처럼 특정 요일을 선택할 수 있는 기능을 추가했습니다. 이 과정은 앱의 여러 부분을 수정해야 하는 큰 작업이었습니다.
- 데이터베이스 구조 변경:
Habit엔티티에 선택된 요일(Set)을 저장할days컬럼을 추가하고, 이를 Room DB에 저장하기 위한TypeConverter를 구현했습니다. 데이터베이스 버전은 2로 올리고,fallbackToDestructiveMigration으로 마이그레이션을 처리했습니다. - ViewModel 로직 수정:
AddViewModel에 요일 선택(selectedDays) 상태를 추가했습니다. 사용자가 "매일"이나 "평일"을 선택하면 관련 요일이 자동으로 선택되고, "주 3회" 등을 선택하면 직접 요일을 고를 수 있도록 로직을 구성했습니다. 또한, 선택 가능한 요일 개수를 주기에 따라 제한하는 디테일도 추가했습니다. - UI 구현:
AddScreen에FilterChip을 사용한 요일 선택 UI를 추가하고, 특정 주기에서만 이 UI가 나타나도록AnimatedVisibility를 사용했습니다.HomeScreen에서는 저장된 요일들이 "월, 수, 금"과 같이 정렬된 텍스트로 표시되도록 개선했습니다.
정확한 시간 선택 기능 (TimePicker Dialog)
"아침", "저녁" 같은 모호한 시간 설정은 향후 Worker를 이용한 알림 기능 구현에 걸림돌이 될 수 있었습니다. 이를 해결하기 위해, Material 3의 TimePicker를 사용한 24시간 형식의 시간 선택 기능으로 전면 교체했습니다.
- 레거시 코드 제거: 기존의 "아침", "저녁" 관련 코드를
HabitOptions.kt와strings.xml에서 모두 삭제했습니다. - 데이터 모델 변경:
Habit엔티티의time속성에 "HH:mm" 형식의 문자열이 저장되도록 변경하고,AddViewModel이 시(Hour)와 분(Minute)을 직접 관리하도록 수정했습니다. - UI 개편:
AddScreen의 기존 칩 그룹을, 선택된 시간을 보여주는 텍스트와 이를 누르면TimePickerDialog가 나타나는 방식으로 완전히 변경했습니다. 이 과정에서 재사용 가능한TimePickerDialog.kt를 만들어 코드 효율성을 높였습니다.
3. 버그 수정과 리팩토링: 더 단단해진 코드
새로운 기능을 추가하는 과정은 순탄하지만은 않았습니다. 여러 번의 빌드 오류와 실수를 통해 코드는 더욱 단단해졌습니다.
@Composable invocations can only happen from the context of a @Composable function: Composable 함수인stringResource()를remember블록 안에서 호출하여 발생한 오류를 수정했습니다.Unresolved reference 'addTypeConverters': 존재하지 않는 Room API를 호출했던 실수를 바로잡고,@TypeConverters어노테이션을@Database클래스에 직접 명시하는 올바른 방식으로 수정했습니다.- 하드코딩된 한글 문자열 ("확인", "취소", 요일 등)을 모두
strings.xml로 이전하여, 다국어 지원의 기반을 마련하고 코드의 유지보수성을 높였습니다.
마치며
오늘의 개발은 "그냥 동작하는" 앱에서 "잘 만들어진" 앱으로 나아가는 중요한 과정이었습니다. 사용자의 입장에서 불편할 수 있는 부분을 미리 고민하고, 향후 확장성을 고려하여 데이터 구조를 설계하며, 꾸준한 리팩토링으로 코드의 품질을 관리하는 것의 중요성을 다시 한번 느낄 수 있었습니다. 앞으로 추가될 알림 기능이 더욱 기대됩니다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
| 습관관리 앱 개발 일지: 대규모 리팩토링 및 기능 추가 (2) | 2025.10.16 |
|---|---|
| 습관관리 앱, 개발 작업 일지 (1) | 2025.10.14 |
| 습관 관리 앱 만들기 (1) - Hilt, Room으로 뼈대 세우기 (1) | 2025.10.10 |
| FocusMe — 습관 트래커 프로젝트 기획서 (1) | 2025.10.08 |
| 30일 만에 Wear OS 앱 출시 (ft AI) 부록... (4) | 2025.09.08 |