⚠️ 문제: Coredata에 데이터를 저장하지 않았으나 데이터가 있는 것으로 판단됨


앱의 첫 실행 시 데이터가 없으므로 API를 호출하여 새로운 데이터를 받아옵니다.
(디버깅용 print문 "1번째 환율 정보 API 호출" 출력으로 첫 호출임을 판단 가능)
첫 호출이므로 loadUpdateDate() 결과로 nil이 반환되어야하나 Optional 값을 언래핑에 실패했다는 오류가 발생합니다.
❗️ 원인: ListCell의 Height 충돌

브레이크포인트를 찍어 확인해보았습니다.
의도대로라면 157번째 줄에서 updateDate.isEmpty == true로 판단되어 nil을 반환했어야하는데,
해당 조건문으로 들어가지 않고 159번 줄을 실행하고 있습니다.
즉, CoreData에 저장된 데이터가 있다는 말이 됩니다.
첫 호출인데 어떤 값을 갖고 있는 것인지 확인해보았습니다.

lldb로 찍어보니 CoreData에서 불러온 데이터의 내부 값은 nil입니다.
159번 줄에서 CoreData로부터 불러온 lastUpdate 값을 Date 타입으로 강제 언래핑하고 있는데,
현재 해당 값이 nil이기 때문에 함수를 호출한 부분에서 언래핑에 실패했다는 에러가 나온 것이었습니다.
🤔 그렇다면 값을 저장한 적이 없는데 왜 156번 줄의 context.fetch 함수가 결과를 반환한 것일까요?
그것은 바로 코드의 순서 때문이었습니다.
// 업데이트 날짜 저장
func saveUpdateDate(lastUpdate: Date, nextUpdate: Date) {
guard let entity = NSEntityDescription.entity(forEntityName: UpdateDate.className, in: context) else { return }
let updateDate = NSManagedObject(entity: entity, insertInto: context) // 생성과 동시에 코어데이터에 값이 없는 상태로 저장됨
if loadUpdateDate() != nil {
updateUpdateDate(lastUpdate: lastUpdate, nextUpdate: nextUpdate)
return
} else {
...
}
saveUpdateDate 함수 내부에서 if문을 시작하기 전 entity와 NSManagedObject 객체를 생성하고 있습니다.
여기서! NSManagedObject는 생성과 동시에 코어데이터에 내부 값이 없는 상태로 저장됩니다.
CoreData에 빈 깡통으로 저장되는 것이지요.
그렇기때문에 새로운 값을 코어데이터에 저장할 때에도 .setValue 를 통해 객체에 값을 할당한 이후
따로 object.save() 같은 객체를 저장하는 동작을 호출할 필요가 없었던 것입니다.
제 경우 깡통을 저장해두고 코어데이터에 저장된 값을 불러왔기 때문에 오류가 발생했던 것입니다.
✅ 해결: NSManagedObject 생성 시점 변경
// 업데이트 날짜 저장
func saveUpdateDate(lastUpdate: Date, nextUpdate: Date) {
if loadUpdateDate() != nil { // 기존 데이터 존재 확인
updateUpdateDate(lastUpdate: lastUpdate, nextUpdate: nextUpdate)
return
} else {
// entity 및 object 생성
guard let entity = NSEntityDescription.entity(forEntityName: UpdateDate.className, in: context) else { return }
let updateDate = NSManagedObject(entity: entity, insertInto: context) // 만듦과 동시에 코어데이터에 값이 없는 상태로 저장됨
// 값 할당
updateDate.setValue(lastUpdate, forKey: UpdateDate.Key.lastUpdate)
updateDate.setValue(nextUpdate, forKey: UpdateDate.Key.nextUpdate)
}
...
}
entity와 object를 생성하는 시점을 변경해줌으로써 해결할 수 있었습니다.
'내일배움캠프 > 환율 계산기 - 개인 프로젝트' 카테고리의 다른 글
| [의사결정기록] MVC 패턴에서의 amountTextField 동작 정의 (0) | 2026.03.09 |
|---|---|
| [트러블 슈팅] 셀 선택 시 여러 개의 데이터가 출력되는 현상 (0) | 2026.03.02 |
| [트러블 슈팅] UICollectionView Cell Autolayout 충돌 (0) | 2026.03.02 |
| [트러블 슈팅] UISearchBar backgroundColor 미적용 (0) | 2026.02.22 |
| [프로젝트 소개] 환율 계산기 앱 만들기 (0) | 2026.02.22 |