UserDefaults
는 iOS에서 간단한 데이터를 저장하고 불러오는 데 자주 사용된다. 하지만 올바르게 사용하지 않으면 데이터 손실, 성능 저하, 유지보수 어려움 등의 문제가 발생할 수 있다. 이 글에서는 UserDefaults
의 기본 개념부터, 자주 발생하는 문제와 올바른 사용법까지 정리해본다.
UserDefaults
는 iOS 앱에서 간단한 Key-Value 데이터를 저장하는 영구 저장소다.
NSUserDefaults
의 Swift 버전이며, 싱글톤 객체로 제공된다. 📌 사용 예시:
isDarkModeEnabled = true
) isAutoLogin = false
) isFirstLaunch = false
) set
)UserDefaults.standard.set(true, forKey: "isFirstLaunch")
UserDefaults.standard.set("행담이", forKey: "nickname")
UserDefaults.standard.set(5, forKey: "level")
object(forKey:)
)let isFirstLaunch = UserDefaults.standard.bool(forKey: "isFirstLaunch") // 기본값 false
let nickname = UserDefaults.standard.string(forKey: "nickname") ?? "사용자"
let level = UserDefaults.standard.integer(forKey: "level") // 기본값 0
removeObject
)UserDefaults.standard.removeObject(forKey: "nickname")
🔹 주의: removeObject(forKey:)
를 호출해도 nil
로 설정될 뿐, 실제 메모리에서 즉시 삭제되지는 않는다.
🔴 잘못된 예시: 대량의 데이터를 UserDefaults에 저장
let bigData = Array(repeating: "데이터", count: 10000)
UserDefaults.standard.set(bigData, forKey: "bigData")
➡️ 문제점:
UserDefaults
는 대용량 데이터(이미지, JSON)를 저장하도록 설계되지 않았다. UserDefaults
의 모든 데이터를 한 번에 메모리로 로드하기 때문에 성능 저하가 발생할 수 있음. ✅ 해결 방법:
FileManager
나 CoreData
, SQLite
를 사용해야 한다. Codable
을 활용하여 UserDefaults
에 저장하는 방법이 더 적합하다. UserDefaults
에 Codable
객체 저장하기 (객체 변환 문제 해결)UserDefaults
는 기본적으로 String
, Int
, Bool
등 기본 데이터 타입만 지원한다.
✅ 객체 저장이 필요할 경우 Codable
을 활용하여 변환하면 된다.
🔹 예제: User
모델을 UserDefaults
에 저장하기
struct User: Codable {
let name: String
let age: Int
}
✔ 객체 저장 (Encoding 후 저장)
let user = User(name: "행담이", age: 5)
if let encoded = try? JSONEncoder().encode(user) {
UserDefaults.standard.set(encoded, forKey: "savedUser")
}
✔ 객체 불러오기 (Decoding 후 사용)
if let savedData = UserDefaults.standard.data(forKey: "savedUser"),
let savedUser = try? JSONDecoder().decode(User.self, from: savedData) {
print("저장된 사용자: \(savedUser.name), 나이: \(savedUser.age)")
}
✅ 장점:
UserDefaults
에서 직접 객체를 저장하는 것이 아니라, JSON 형태로 변환 후 저장하여 유지보수가 쉬움 Codable
을 활용하면 데이터 변환 과정이 간단하고 안정적 UserDefaultsManager
만들기)앱 곳곳에서 UserDefaults.standard.set(...)
을 직접 호출하면 유지보수가 어려워진다.
➡️ 이를 해결하기 위해 UserDefaultsManager
를 만들어 중앙에서 관리하는 것이 좋다.
🔹 UserDefaultsManager 구현 예시
final class UserDefaultsManager {
static let shared = UserDefaultsManager()
private let defaults = UserDefaults.standard
private init() {} // 싱글톤: 외부에서 인스턴스 생성 방지
enum Keys {
static let isFirstLaunch = "isFirstLaunch"
static let nickname = "nickname"
}
var isFirstLaunch: Bool {
get { defaults.bool(forKey: Keys.isFirstLaunch) }
set { defaults.set(newValue, forKey: Keys.isFirstLaunch) }
}
var nickname: String? {
get { defaults.string(forKey: Keys.nickname) }
set { defaults.set(newValue, forKey: Keys.nickname) }
}
}
🔹 사용 예시
UserDefaultsManager.shared.isFirstLaunch = true
let isFirstLaunch = UserDefaultsManager.shared.isFirstLaunch
✅ 장점:
Keys
)을 상수로 관리하여 오타 방지 및 가독성 향상 UserDefaults
접근을 캡슐화하여 코드 중복 방지 및 유지보수 용이 ✔ 앱 설정 저장 (다크 모드
, 알림 설정
, 자동 로그인
)
✔ 간단한 사용자 정보 (사용자 이름
, 첫 실행 여부
, 레벨
)
✔ 작은 크기의 데이터 (Bool
, Int
, String
, Date
)
❌ 대량 데이터 (이미지, JSON, 배열) 저장 → CoreData
, FileManager
추천
❌ 보안이 필요한 데이터 (비밀번호, 토큰 등) → Keychain
추천
❌ 자주 변경되는 데이터 (실시간으로 업데이트되는 정보) → UserDefaults
는 즉시 동기화되지 않음
📌 최적의 활용법
UserDefaultsManager
를 만들어 키 관리 및 접근 로직을 캡슐화 Codable
을 활용하여 객체를 JSON으로 변환 후 저장 UserDefaults
는 간단한 설정값 저장 용도로만 사용하고, 대량 데이터 저장은 피하기 💡 결론:
UserDefaults
는 간단한 데이터 저장에는 유용하지만, 잘못 사용하면 성능 및 유지보수에 문제가 생길 수 있다. 올바른 패턴을 활용하면 더 효율적이고 안전하게 데이터를 관리할 수 있다.
👉 "UserDefaults를 무조건 쓰기보다, 어떤 데이터에 적절한지 고민하고 사용하는 것이 중요하다!"