iOS에서 데이터를 저장하는 방법은 데이터의 성격(크기, 보안, 복잡성 등)에 따라 다양하다. 주요 방법은 다음과 같다:
UserDefaults는 간단한 데이터를 저장하기에 편리하지만, 몇 가지 주의할 점이 있다:
// 설정값 저장
UserDefaults.standard.set(true, forKey: "isDarkModeEnabled")
UserDefaults.standard.set("John", forKey: "userName")
// 데이터 읽기
let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkModeEnabled")
let userName = UserDefaults.standard.string(forKey: "userName") ?? "Guest"
print("Dark Mode: \\(isDarkMode), User: \\(userName)")
주의: 대량의 JSON이나 배열을 저장하려면 UserDefaults 대신 파일 시스템이나 Core Data를 고려하자.
Keychain은 iOS에서 보안이 중요한 데이터를 저장하기에 최적화되어 있다. 주로 아래와 같은 데이터를 저장한다:
Keychain은 데이터를 암호화하고, 앱이 삭제되어도 유지되며, 시스템 수준에서 관리되므로 보안성이 높다.
import Security
// Keychain에 비밀번호 저장
let keychain = KeychainSwift()
keychain.set("mySecretPassword123", forKey: "userPassword")
// Keychain에서 비밀번호 읽기
if let password = keychain.get("userPassword") {
print("저장된 비밀번호: \\(password)")
}
적합성: "userPassword"처럼 민감한 데이터를 저장할 때 사용. UserDefaults와 달리 보안이 보장됨.
Core Data와 SQLite는 둘 다 데이터베이스 역할을 하지만, 설계 목적과 사용 방식이 다르다.
| 항목 | Core Data | SQLite |
|---|---|---|
| 설계 목적 | 객체 그래프 관리 | 경량 관계형 데이터베이스 |
| 데이터 모델 | 객체 지향 (NSManagedObject) | 테이블 기반 (SQL 쿼리) |
| 복잡성 | 설정이 복잡하지만 추상화 제공 | 직접 쿼리 작성 필요 |
| 성능 | 소규모-중규모 데이터에 적합 | 대량 데이터 처리에 유리 |
// 엔티티에 사용자 추가
let context = persistentContainer.viewContext
let user = User(context: context)
user.name = "Alice"
user.age = 25
try? context.save()
let db = FMDatabase(path: databasePath)
db.open()
db.executeUpdate("INSERT INTO Users (name, age) VALUES (?, ?)", withArgumentsIn: ["Bob", 30])
db.close()
결론: 간단한 앱에선 Core Data로 관계를 관리하고, 대규모 데이터 분석이 필요하면 SQLite를 선택하자.