한 거
TimerRepository 프로토콜 정의
→ fetchAll, insert, update, delete 추상화로 CRUD 규격 확립
SwiftDataManager 구현
→ TimerRepository 채택, @Dependency(.modelContext)를 이용해 ModelContext 주입
→ 실제 SwiftData 기반의 CRUD 메서드 구현 완료
에러 처리를 RepositoryError enum으로 정리
→ entityNotFound, saveFailed, fetchFailed 케이스 정의
→ LocalizedError 채택해 사용자 친화적인 에러 메시지 제공
의존성 역전 : ViewModel이나 VC에서는 TimerRepository만 바라보므로, 저장소 구현체를 교체하거나 확장하기 쉬움
SwiftData FetchDescriptor 사용법:
predicate와 sortBy 조합으로 원하는 조건과 정렬 적용 가능
fetchLimit으로 단일 엔티티만 가져오는 최적화 가능
에러 처리 일원화 : 다양한 CRUD 과정에서 발생할 수 있는 문제를 RepositoryError 하나로 캡슐화해 관리가 용이
처음에는 modelContext.save() 누락으로 데이터 반영이 안 됨 → try-catch 구문 추가
특정 엔티티 조회 시 fetchAll을 반복 호출하는 비효율 발견 → fetch(by:) 헬퍼 메서드로 리팩터링