컴퓨터언어/Swift

[Swift] Attempt to set a non-property-list object : 커스터마이징한 데이터 타입은 UserDefault에 담지 말자!

bbanpro 2020. 4. 19. 17:07
728x90
반응형

이는 UserDefault를 배우면 마주치게 되는 오류이다.

 

UserDefault는 App 실행 시 유저가 App 내에서 설정한 값들을 저장하기 위한 용도로 사용되어야 한다.

 

여기서 "설정한 값"은 매우 작고 단순한 데이터여야 한다.

ex)유저가 커스텀화한 것으로서 App에서의 선호 볼륨 값(Float), 최고 점수(Int), 유저 닉네임(String), 자동실행 여부(Bool) 또는 이 앱이 설치 후 처음 실행되고 있는지에 따른 도움말 표시 여부까지(!)

 

즉 이 작은 데이터들은 Key-Value 형태로 .plist에 가볍게 저장되는 것이다.

 

여기에 Array나 Dictionary 같이 메모리를 많이 잡아먹는 무거운 녀석들을 담는다면,

 

간단한 정보 저장을 담당하는 UserDefault의 존재 목적과 철학에 위배되는 것이다.

 

따라서 UserDefault를 이런 대용량 데이터베이스처럼 사용해서는 절대 아니 된다.

 

그럼 진정한 데이터 저장은 무엇을 사용해야 할까?

 

 

 

    특징 한계

Table

 

Codable

(PropertyListEncoder)

내가 만든 클래스 타입으로 커스터마이징된 데이터 저장 가능.

나만의 데이터 ->(Encoder)->.plist->(Decoder)->읽기

plist 파일을 메모리에 적재되는 데 부담됨.

큰 데이터 저장은 피하는 게 좋음.

(100KB 이하 수준)

Keychain

(API)

API를 활용하여 상대적으로 안전한 데이터 저장 방법.

개인정보 저장 담당.

여전히 저용량 중심.
Database SQLite SQL을 이용하여 대용량 데이터도 메모리 아낄 수 있음.  
Core Data 객체지향 방식. SQLite보다 더 유연함.  
Realm 가장 빠르고 쉬운 오픈소스  

 

정리)

Array나 Dictionary, 그중에서도 특히 내가 따로 만들어낸 Class타입을 원소로 갖는 애들은 UserDefault가 아니라 위의 것들을 이용하자.

728x90
반응형