앱 개발에서 데이터 저장을 관리하기 위해 Core Data를 사용해야하는데 오늘까지 Core Data를 완전히 구현하지 못했고 그 과정에서 겪은 여러 문제들을 정리해보려 한다.
BookEntity
와 KakaoBook
의 타입 불일치프로젝트는 외부 API에서 책 데이터를 받아오는 구조로KakaoBook
이라는 구조체를 사용하고 있었다.
반면에 Core Data는 NSManagedObject
를 기반으로 데이터를 관리하기 때문에 BookEntity
라는 클래스를 생성했는데 이 두 데이터 모델이 서로 다른 구조를 가지고 있어 변환 과정에서 문제가 발생한 것 같다.
그리고 thumbnail
이라는 속성이 문제가 됐었는데,
KakaoBook
에서는 thumbnail
을 URL 문자열로 관리했지만, Core Data에서는 이미지를 Data
타입으로 저장하도록 설계를 했었다.
그래서 데이터 변환 중에 다음과 같은 오류가 발생했는데
Cannot assign value of type 'UIImage?' to type 'String?'
결국 KakaoBook
구조체를 확장하여 Core Data의 BookEntity
에서 데이터를 변환할 수 있는 초기화 메서드를 작성해야 했다.
하지만 변환 과정에서 UIImage
와 String
사이의 매핑 논리가 맞지 않아 시간을 허비했다.
Core Data 모델을 설계할 때, thumbnailURL
이라는 속성을 추가하지 않은 것이 문제였다.
초기에 API에서 이미지를 URL
로 받아오고 있었음에도 불구하고 Core Data에서는 이미지를 Data
로 저장하려고 했다.
thumbnailURL
속성을 추가하기로 했지만 Core Data 모델을 변경한 뒤 기존 데이터를 삭제하거나 마이그레이션을 수행해야 했는데,
자동 마이그레이션을 활성화해봤지만.. 여전히 기존 데이터와 새 모델 간의 충돌이 발생했다.
이 과정에서 Core Data 저장소를 삭제하거나 다시 생성하는 방법을 여러 번 시도해봤지만
데이터가 제대로 저장되지 않거나, 기존 데이터가 손실되는 문제가 반복됐다.
RxSwift와 RxCocoa를 활용해 테이블 뷰의 데이터를 관리하려고 했다.
하지만 RxCocoa
의 rx.itemSelected
를 사용하는 과정에서 오류가 발생했다.
Property 'itemSelected' requires that 'UITableView' inherit from 'UIPickerView'
이 오류는 RxCocoa
와 UITableView
간의 확장이 제대로 적용되지 않은 경우에 발생하는 것으로 보였다.
계속 시간을 허비하다보니 그냥 프로젝트에서 RxCocoa를 사용하지 않고 UITableViewDelegate
와 UITableViewDataSource
를 직접 구현하는 방식으로 변경하면서 문제를 해결하려 했다.
이 과정에서 RxCocoa
와의 결합도를 낮췄지만 결국 Core Data의 데이터 흐름과 UI 간의 연동이 원활하지 않아 최종적으로 구현에 실패했다..
NSPersistentContainer
초기화 문제Core Data를 초기화하는 과정에서도 문제가 발생했다.
NSPersistentContainer
의 이름이 .xcdatamodeld
파일 이름과 일치하지 않아서 컨테이너가 로드되지 않는 오류가 있었다.
코드를 수정해보았지만 여전히 자동 마이그레이션 과정에서 충돌이 발생했다.
아래와 같은 오류는 데이터를 제대로 관리하지 못했음을 보여준다.
Thread 1: "An NSManagedObject of class 'BookEntity' must have a valid NSEntityDescription."
이 오류는 Core Data 모델과 BookEntity
클래스 간의 매핑이 올바르게 설정되지 않았기 때문에 발생한다고 하는데,
이걸 해결하려고 디버깅 로그를 추가해봤지만 문제를 완전히 해결하지 못했다.
여러 시도에도 불구하고 구현은 하지 못했다.
그래도 다음부터 신경써야겠다는 점은,
앞으로 Core Data를 다시 도입하게 된다면, 더 나은 설계를 시도해봐야겠다고 생각했다.