앱에서 CoreData를 사용할 때, 데이터를 정렬하여 가져오는 것이 중요하다. 특히 최신 데이터를 정확하게 가져오지 못하면, 의도한 동작과 다른 결과가 발생할 수 있다. 이번에는 HangdamEntity
데이터를 정렬할 때 발생한 문제와 해결 과정을 정리한다.
앱에서 HangdamEntity
를 생성하고, fetchLatestHangdam()
메서드를 통해 최신 데이터를 가져오도록 구현했다. 하지만 총 세 개의 행담이를 생성했음에도 불구하고, 항상 두 번째 행담이의 이름이 알림으로 뜨는 문제가 발생했다.
문제의 원인을 파악하기 위해 fetchLatestHangdam()
의 구현을 다시 살펴보았다.
func fetchLatestHangdam() -> HangdamDTO? {
let fetchRequest: NSFetchRequest<HangdamEntity> = HangdamEntity.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "startDate", ascending: false)]
fetchRequest.fetchLimit = 1
do {
if let entity = try context.fetch(fetchRequest).first {
var hangdamDTO = HangdamMapper().toDTO(from: entity)
if hangdamDTO.name == nil {
hangdamDTO.name = "행담이"
}
return hangdamDTO
}
} catch {
print(DataError.fetchRequestFailed.localizedDescription)
}
return nil
}
이 메서드는 startDate
를 기준으로 내림차순 정렬하여 가장 최근의 행담이를 가져오도록 되어 있다. 하지만 문제는 일부 행담이의 startDate
값이 nil
일 가능성이 있다는 점이었다. 만약 startDate
가 설정되지 않았다면, 정렬이 올바르게 동작하지 않을 수 있다. 그 결과, 두 번째로 생성한 행담이가 항상 최신 데이터로 인식될 가능성이 높았다.
해결 방법은 간단했다. 행담이를 생성할 때 startDate
를 현재 시간으로 설정하여, 정렬 기준이 항상 존재하도록 하면 된다.
func createHangdam() -> HangdamEntity {
let entity = HangdamEntity(context: context)
saveContext()
print("[CoreData] 새로운 행담이 생성")
return entity
}
이 코드에서는 startDate
값을 설정하지 않았기 때문에, 일부 행담이의 startDate
가 nil
일 가능성이 있다.
func createHangdam() -> HangdamEntity {
let entity = HangdamEntity(context: context)
entity.startDate = Date() // 현재 시간을 startDate로 설정
saveContext()
print("[CoreData] 새로운 행담이 생성")
return entity
}
이제 createHangdam()
을 호출할 때마다 startDate
가 자동으로 현재 시간으로 설정되므로, fetchLatestHangdam()
에서 올바르게 정렬할 수 있다.
이렇게 수정한 후 다시 실행해보니, 가장 마지막에 생성한 행담이가 정상적으로 최신 데이터로 인식되었다. 더 이상 두 번째 행담이의 이름으로 알림이 뜨는 문제가 발생하지 않았다.
CoreData에서 데이터를 정렬할 때, 정렬 기준이 되는 값이 항상 존재하는지 확인하는 것이 중요하다. startDate
를 기준으로 최신 데이터를 가져오려면, 행담이를 생성할 때 반드시 startDate
값을 설정해야 한다. 이러한 사소한 차이가 데이터 관리에서 큰 영향을 줄 수 있다.
이번 문제를 통해 CoreData 사용 시 데이터의 일관성을 유지하는 것이 얼마나 중요한지 다시 한 번 깨닫게 되었다.