CoreData에서 데이터 정렬 문제 해결하기

sonny·1일 전
0

TIL

목록 보기
134/135

앱에서 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 값을 설정하지 않았기 때문에, 일부 행담이의 startDatenil일 가능성이 있다.

수정 후 코드

func createHangdam() -> HangdamEntity {
    let entity = HangdamEntity(context: context)
    entity.startDate = Date()  // 현재 시간을 startDate로 설정
    saveContext()
    print("[CoreData] 새로운 행담이 생성")
    return entity
}

이제 createHangdam()을 호출할 때마다 startDate가 자동으로 현재 시간으로 설정되므로, fetchLatestHangdam()에서 올바르게 정렬할 수 있다.

결과 확인

이렇게 수정한 후 다시 실행해보니, 가장 마지막에 생성한 행담이가 정상적으로 최신 데이터로 인식되었다. 더 이상 두 번째 행담이의 이름으로 알림이 뜨는 문제가 발생하지 않았다.

결론

CoreData에서 데이터를 정렬할 때, 정렬 기준이 되는 값이 항상 존재하는지 확인하는 것이 중요하다. startDate를 기준으로 최신 데이터를 가져오려면, 행담이를 생성할 때 반드시 startDate 값을 설정해야 한다. 이러한 사소한 차이가 데이터 관리에서 큰 영향을 줄 수 있다.

이번 문제를 통해 CoreData 사용 시 데이터의 일관성을 유지하는 것이 얼마나 중요한지 다시 한 번 깨닫게 되었다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보