본문 바로가기

iOS/Swift

UserDefaults / Keychain / Core Data

iOS앱에 데이터를 저장하는 여러가지 방법들이 있는데 대표적인 3가지 UserDefaults, keychain, Core Data를 언제 써야하는지에 대해서 알아보자!

 

💫 UserDefaults

가장 일반적이고 쉽게 적용할 수 있는 UserDefaults는 그 이름처럼 사용자의 기본적인 데이터베이스를 저장하기 위해 사용한다. UserDefaults는 Property list 형식으로 저장되어있고, NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary의 타입을 저장할 수 있다. 그 외의 타입은 NSData로 변환해서 사용할 수 있다.

 

✅ 사용자가 선호하는 캐릭터, 미디어 재생 속도, 게임 최고점, 최근 방문한 지역, 최초 튜토리얼 화면

사용자가 설정한 목록이나 단일 데이터를 저장할 수 있다.

❌ 50개 이상의 사용자가 좋아하는 음악리스트, 사이즈가 큰 데이터, NSData로 컨버팅한 이미지, 개인정보

큰 용량의 데이터를 UserDefaults에 저장하여 사용하는 것은 앱의 성능에 큰 영향을 줄 수 있으므로 반드시 사용을 지양해야 한다. 또, UserDefaults는 보안에 취약하기 때문에 개인정보나 민감한 데이터를 저장하는데 사용하는 것을 피해야 한다.

 

💫 Keychain

앞서 말했듯이 UserDefaults는 사용자가 쉽게 데이터를 볼 수 있고 또 조작이 가능하다. 예를 들어 앱에서 isPremium 변수를 두어 프리미엄 버전과 무료 트라이얼 버전을 구분하게 UserDefaults에 저장하여 사용하면 변수 값을 true로 변경하면 돈을 내지 않고도 프리미엄 버전을 사용할 수 있게 되는 치명적인 문제를 야기할 수 있다. 이러한 경우 뿐만 아니라 사용자 비밀번호, API Key와 같이 민감한 데이터들은 Keychain을 사용하는게 더 나은 선택지이다. Keychain Service API는 민감한 데이터를 데이터베이스에 암호화 하여 저장하고 불러올 땐 복호화하여 사용한다. Keychain Service API는 C언어로 작성되어 있어 Keychain Access와 같은 래퍼 라이브러리를 사용해 쉽게 사용할 수 있다. 또, Keychain의 경우 같은 개발자가 만든 앱끼리도 데이터를 공유하여 사용할 수 있는 장점이있다.

 

✅ 민감한 데이터, 사용자가 임의로 변경할 수 없는 데이터, 다른 앱과 공유할 데이터

Keychain을 사용하여 iOS App <-> Watch App과 같이 다른 플랫폼의 앱과 데이터를 공유할 수 있다.

❌ 기본적인 정보

성능상 UserDefaults가 유리하므로 적재적소에 Keychain과 UserDefaults를 각각 사용하자

 

💫 Core Data

UserDefaults에서 50개 이상의 큰 데이터는 적합하지 않다고 했다. Keychain도 같은 이유로 적합하지 않다. 그럴 때 Core Data를 사용하는게 적합할 수 있다. Core Data를 처음 접해보면 xcdatamodel과 같은 파일도 생기고 위에 서술한 UserDefaults나 Keychain보다는 사용하는게 복잡하게 느껴질 수 있다. Core Data를 사용하다보면 Database 프레임워크와 같은 형태로 되어 있다고 느끼지만 Core Data는 데이터베이스가 아니다. Core Data는 객체 관계를 관리하는 프레임워크이므로 데이터베이스처럼 사용하되 데이터베이스로 사용하면 안된다. Core Data는 객체안에 다른 객체를 맵핑하여 구성할 수 있으므로 NSPredicate 쿼리를 사용하면 데이터를 빠르게 필터하거나 정렬 할 수 있다.

 

✅ Todo리스트, 1:1/1:n/n:n 형태의 데이터, 쿼리로 필터링이나 정렬이 필요한 데이터

1개의 주문에 n개의 상품이 있는 데이터등을 구성하기에 간편하다.

❌ 유저가 소유하지 않은 데이터 리스트

데이터베이스는 서버사이드 DB를 사용하자