iOS

[iOS] iOS에서 데이터를 저장하는 방법

yanni13 2024. 5. 14. 02:35

 

 

오늘 다뤄볼 주제는 iOS앱에서 데이터를 저장하는 방법에 대해서 다뤄볼 것이다.

스터디에서 가져온 질문은 아래와 같다~

 

 

 

1️⃣ iOS 앱에서 데이터를 저장하는 방법에는 어떤 것들이 있나요?

 

앱에서 데이터를 저장하는 방법에는 여러가지가 있다. 

👉🏻 UserDefaults, KeyChain, Core Data, SQLite, CloudKit, File Manager 등등

여러가지 방법이 있는데 어떻게 데이터를 저장하고 관리할껀지에 따라 적절하게 선택해주면 된다.

 

아래에서 다루지 않는 CloudKit이랑 File Manager에 대해 잠깐 설명하고 넘어가겠다!

 

CloudKit

CloudKit은 Apple이 제공하는 클라우드 서비스 프레임워크이며  iCloud 서비스를 사용하여 데이터를 클라우드에 저장하고 동기화한다.

 

CloudKit을 사용하여 데이터를 저장하면 앱의 데이터를 iCloud에 저장하고, 모든 기기와 웹에서 데이터를 최신 상태로 유지할 수 있다.

사용자의 Apple ID에 연동되어 여러 기기 간에 데이터 동기화를 지원하고 자동으로 관리되고 백업된다.

 

예를 들어 사진을 저장하면 다 iCloud로 저장되고 자동으로 백업되는게 바로 CloudKit이 사용되는 경우다!

 

 

 

File Manager                                      

애플 공식문서에서는 file system과 상호작용 가능한 인터페이스라고 설명하고 있다.

 

디렉토리에 접근하여 데이터를 저장하는 방식이 FileManager 클래스이며 파일과 디렉토리를 찾고 만들고 복사하며 이동하는데 사용된다.

이 방식을 사용할 땐 데이터를 직접 저장하거나, JSON encoder, decoder를 사용해주어서 변환시킨 후 저장해야 한다.

 

주로 Document, Library, tmp 데이터를 저장할 때 File Manager를 사용하면 좋다.

 

2️⃣ UserDefaults의 사용 예시와 주의 사항을 설명해주세요

 

UserDefaults

 

apple 공식문서는 위와 같이 앱을 실행할 때 지속적으로 키-값 쌍을 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스라고 설명하고 있다.

 

또한 UserDefaults는 싱글톤 패턴으로 설계되어 있다.

 

싱글톤패턴이란 특정 용도로 객체를 하나만 생성하여 공용으로 사용하고 싶을 때 사용하는 디자인 유형이다.

즉, 공용으로 사용가능하기 때문에 필요한 정보를 꺼내서 사용 가능하다는 얘기!!

 

즉, 사용자의 설정을 저장하는데 사용한다. 이 때 plist에 데이터를 영구적으로 저장해준다.

 

예를 들어, 사용자가 설정에서 토글을 통해 어떤 설정을 바꾸는데 ->  화면을 나가도 이 설정이 계속 유지 되는 것을 알 수 있다

이 경우에 사용된다!!

 

또한, UserDefaults를 사용하면 앱의 어느 곳에서나 데이터를 쉽게 읽고 저장할 수 있다!

반면, 암호화되지 않아 보안이 필요한 데이터에는 부적합하다. 

 

현재 진행하고 있는 프로젝트에서 사용자 정보를 담고 있는 api를 연동하여 UserDefaults에 저장하고 있는데, 사용자 정보에 보안이슈가 발생하는 정보들이 없지만, 만약 이 사용자 정보를 넘겨주는 api에 카드 정보, 주민등록번호, 인증키 이런 민감한 정보가 담겨있을 때에는 UserDefaults에 저장하면 안되기 때문에 보안이슈가 발생할 정보에 한해서는 다른 방법으로 저장해야 한다!

 

 

 

🔥 사용방법

import SwiftUI

struct ContentView: View {
    //데이터 불러올 때
    @State private var count = UserDefaults.standard.integer(forKey: "here")
    
    var body: some View {
        VStack {
            Text("clicked count: \(count)")
            Button(action: {
                self.count += 1
                //데이터 저장할 때
                UserDefaults.standard.set(count, forKey:"click")
            }, label: {
                Text("Click")
            })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

 

UserDefaults를 사용한 예시를 간단한 코드로 작성해보았다!

click 버튼을 누르면 UserDefaults의 값을 불러오고 업데이트된 값을 저장해준 예시이다.

 

 

데이터에 값을 불러 올 때

let count = UserDefaults.standard.integer(forKey: "here")
let id = UserDefaults.standard.string(forkey: "id")

 

만약 데이터를 불러올 때 값이 없다면 bool 타입은 false, integer/Double/Float 타입은 0을 반환하도록 한다.

 

 

데이터를 저장할 때

UserDefaults.standard.set(count, forKey: "click") //Integer 타입일 때
UserDefaults.standard.set("hello", forKey: "string") //String 타입일 때

 

key-value쌍으로 데이터를 저장해줘야 한다.

 

 

특정 데이터 삭제할 때

UserDefault.standard.removeObject(forKey:"click")

 

삭제 할 때는 removeObject를 사용하여 삭제할 때 키값을 사용하여 삭제할 수 있다.

 

 

3️⃣ Keychain은 어떤 데이터를 저장하는 데 적합한가요?

 

Keychain은 보안이 필요한 데이터를 암호화하여 안전하게 저장해주는 데이터 베이스이다.

 

 

 

위에 그림은 애플 공식문서에서 들고온 Keychain service 구조이다.

 

Keychain Services api를 사용하여 보안이 필요한 데이터를 암호화하고, 이 정보를 사용할 때 복호화하여 재사용하는 방식이다.

 

 

KeyChain에서는 데이터가 암호화되어 저장되기 때문에 보안이 필요한 데이터에 적합하며 비밀번호나 OAuth 토근 등 UserDefaults에 정보를 저장하려 할 때 보안 문제가 발생할 거 같은 정보들을 다 Keychain을 사용하여 저장하는데 유용하다.

 

Keychain의 특징을 조금 더 알아보자면, 앱을 삭제하고 다시 깔아도 저장된 정보는 그대로 유지됐었고, 기기를 변경해도 마이그레이션 하면 비밀번호나 다른 앱에 사용되는 비밀번호가 남아있는 것을 한번쯤은 경험했을 것이다!

바로 Keychain은 앱이 삭제되거나 다른 기기로 정보를 옮길 때도 정보를 저장하고 있기 때문이다!

-> 사용자가 삭제하지 않는 한 정보가 남아있음

 

대신 디바이스를 잠그면 키체인도 잠기기 때문에 접근할 수 없고 디바이스를 열면 키체인도 풀리는 특징이 있다.

 

 

4️⃣ Core Data와 SQLite의 차이점은 무엇인가요?

 

Core Data

 

 

애플 공식문서를 확인해보면 CloudKit을 사용하여 디바이스에 데이터를 유지 또는 cahce 할 수도 있고, 데이터를 여러장치에 동기화하는 애플 프레임워크이다.  (데이터베이스가 아님!)

복잡한 데이터 모델과 관계를 관리하고 대량의 구조화된 데이터를 로컬에서 처리하는데 적합하다고 한다.

 

또한, 오프라인에서 어플리케이션의 영구적인 데이터를 저장하고 일시적인 데이터를 캐시할 수 있다. 

 

보통 CoreData와 CloudKit를 같이 사용했을 때 시너지가 난다고 한다.

 

 

SQLite

 

웹 브라우저나 ios, 안드로이드 모두 사용가능하며 이 기기에 내장된 관계형 데이터베이스라고 한다.

서버가 아닌 응용프로그램에 넣어 사용하는 경량적인 데이터베이스이며 직접적인 데이터베이스 관리가 필요할 때 사용되며, 대량의 유사한 데이터 즉, 여러 사용자에 대한 데이터를 저장해야 하는 경우에 주로 사용된다.

 

UserDefaults는 간단한 사용자 정보에 한해서 저장됐다면, SQLite는 대량의 데이터에 대해서 저장된다고 보면된다!

SQLite는 SQL쿼리문을 사용해서 데이터를 관리하기 때문에 사용할 때 Swift에 SQLite를 import 해서 사용해주어야 한다.

 

 

 

 

CoreData와 SQLite의 차이점

 

CoreData는 데이터 모델링 도구를 포함한 프레임워크로 iOS에서 객체 그래프 관리 및 지속성 저장을 돕는다. 디바이스 자체에 데이터를 저장하므로 오프라인에서도 동작가능하며 클라우드를 제외하고는 데이터를 공유할 수 없다.

코어데이터는 주로 데이터의 구조가 복잡하거나 관계가 중요한 애플리케이션에서 사용되어 데이터 관리를 보다 객체 지향적으로 할 수 있다.

 

SQLite는 직접적인 데이터 베이스 파일 시스템으로 SQL 쿼리를 사용하여 데이터를 관리한다. 관계형 데이터베이스라는 것이 특징이며 Core Data에 비해 저수준의 작업이 가능하며, 데이터 베이스 관리에 좀 더 세밀한 제어가 필요한 경우 사용된다.

 

SQLite보다 코어데이터가 더 빠르게 데이터를 가져올 수 있지만 더 많은 메모리와 저장공간을 사용한다.

 

 

 

 

느낀점

UserDefaults는 프로젝트하면서 사용해봤고, KeyChain도 팀원이 구현해서 코드리뷰하면서 잠깐 맛보기로 알아봤어서 이해가 쉬웠는데, CoreData는 직접 해보지 않아서 그런지,, 글로만 이해하기 정말 어려웠다,,,, 이래서 경험해본 것과 안해본것의 차이가 크다는 것을 또 한번 실감하게 되었고 CoreData는 따로 직접 구현을 해보면서 이해를 해봐야 할 거 같다. 

 

참고

https://velog.io/@rose6649/IOS-Keychain-%ED%82%A4%EC%B2%B4%EC%9D%B8-%EC%82%AC%EC%9A%A9%EB%B2%95