⏰ 퀵라벨타이머 (QuickLabelTimer)
플랫폼·기술: iOS 앱, SwiftUI
앱 컨셉: 시간을 빠르게 설정할 수 있는 퀵 타이머에, ‘왜 맞췄는지’를 기록할 수 있는 라벨 기능을 결합한 타이머 앱
개발 목적: AI-Assisted Programming을 실제 서비스 개발에 적용하여 장단점을 살펴보고, 서비스 완성 및 운영 경험을 통해 설계 능력과 문제 해결 능력을 강화하고자 함
GitHub: https://github.com/data-sy/quick-label-timer
![]() | ![]() |
---|
이번 주는 버그 수정과 리팩토링을 주로 진행했다. 그 과정에서 알림 동작과 관련된 예상치 못한 문제를 발견했고, 정책을 조금 더 안정적인 방향으로 바꾸게 되었다. 출시 전에 발견해서 다행이었다.
[ 주요 작업 요약]
버그를 해결하는 과정은 연쇄적인 결정의 흐름으로 이어졌다. 예를 들어,
[예시 1]
앱을 강제 종료하면 실행 중이던 타이머는 사라지는데, 예약된 알림은 그대로 울려버리는 문제
→ 이를 개선하기 위해 앱 재실행 후에도 타이머를 유지하기로 했고,
→ 그러려면 영속성(UserDefaults
) 로직을 추가해야 했으며,
→ 타이머가 남아있게 되니 프리셋을 숨기는 대신 실행 중 상태로 덮는 오버레이 방식으로 UI를 변경했고,
→ 오버레이 방식에서의 최신순 정렬은 공간적 일관성이 깨져 보여서, 정렬 기준을 최신순에서 생성순으로 바꿔야 했다.
[예시 2]
알림 개수에는 시스템 한계가 있으므로 실행 중인 타이머 개수를 5개로 제한하기로 함
→ 타이머는 최대 5개인데, 즐겨찾기를 무제한 저장하는 건 UX적으로 어색하니 즐겨찾기 개수도 20개로 제한을 두기로 했고,
→ 그러다 보니 기존 모델 구조(Bool isFavorite
)로는 다음 버그를 해결하기 복잡했다.
즐겨찾기가 19개 저장된 상태에서 실행중인 타이머 5개를 즐겨찾기 토글(⭐️)로 예약 할 수 있음.
이 때문에 사용자는 20개 이상 프리셋을 저장할 수 있다고 착각하지만, 실제로 저장 버튼을 누를 때 제한에 걸려 실패.
결국 UI와 데이터 상태가 불일치하는 버그 발생
→ 그래서 속성을 Enum endAction
으로 바꾸어 상태를 더 명확히 표현했고,
→ 그 결과 데이터 마이그레이션, 모델 관련 로직 전면 수정이 뒤따랐다.
하나의 버그 수정에서 예상하지 못했던 사이드 이펙트들이 팡팡 터졌다. 마치 100층짜리 탑에서 99층을 고치려다 10층이 흔들리는 느낌이랄까? 앱이 완성에 가까워질수록 작은 수정이 전체 구조에 큰 파장을 미친다는 걸 실감한 한 주였다.
이번 주에 진행하려 했으나 버그 수정 규모가 커서 한 주 미룬 작업들: