Swift에서 UserDefaults 올바르게 사용하기

sonny·2일 전
0

TIL

목록 보기
133/135

UserDefaults는 iOS에서 간단한 데이터를 저장하고 불러오는 데 자주 사용된다. 하지만 올바르게 사용하지 않으면 데이터 손실, 성능 저하, 유지보수 어려움 등의 문제가 발생할 수 있다. 이 글에서는 UserDefaults의 기본 개념부터, 자주 발생하는 문제와 올바른 사용법까지 정리해본다.


1. UserDefaults란?

UserDefaults는 iOS 앱에서 간단한 Key-Value 데이터를 저장하는 영구 저장소다.

  • 앱이 종료되더라도 데이터가 유지된다.
  • NSUserDefaults의 Swift 버전이며, 싱글톤 객체로 제공된다.
  • 앱이 저장하는 설정, 사용자 기본값 등을 관리하는 용도로 적합하다.

📌 사용 예시:

  • 다크 모드 설정 (isDarkModeEnabled = true)
  • 자동 로그인 여부 (isAutoLogin = false)
  • 앱의 첫 실행 여부 (isFirstLaunch = false)

2. UserDefaults의 기본 사용법

값 저장 (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로 설정될 뿐, 실제 메모리에서 즉시 삭제되지는 않는다.


3. UserDefaults의 문제점과 해결 방법

① 과도한 데이터 저장 (UserDefaults를 DB처럼 사용하면 안 됨)

🔴 잘못된 예시: 대량의 데이터를 UserDefaults에 저장

let bigData = Array(repeating: "데이터", count: 10000)
UserDefaults.standard.set(bigData, forKey: "bigData")

➡️ 문제점:

  • UserDefaults는 대용량 데이터(이미지, JSON)를 저장하도록 설계되지 않았다.
  • 앱이 실행될 때 UserDefaults의 모든 데이터를 한 번에 메모리로 로드하기 때문에 성능 저하가 발생할 수 있음.

해결 방법:

  • 대량 데이터는 UserDefaults가 아니라 FileManagerCoreData, SQLite를 사용해야 한다.
  • JSON 저장이 필요하면 Codable을 활용하여 UserDefaults에 저장하는 방법이 더 적합하다.

UserDefaultsCodable 객체 저장하기 (객체 변환 문제 해결)

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을 활용하면 데이터 변환 과정이 간단하고 안정적

③ 싱글톤 패턴을 활용한 UserDefaults 관리 (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 접근을 캡슐화하여 코드 중복 방지 및 유지보수 용이

4. 정리 (UserDefaults 올바른 사용법)

사용하면 좋은 경우

✔ 앱 설정 저장 (다크 모드, 알림 설정, 자동 로그인)
✔ 간단한 사용자 정보 (사용자 이름, 첫 실행 여부, 레벨)
✔ 작은 크기의 데이터 (Bool, Int, String, Date)

사용하면 안 되는 경우

대량 데이터 (이미지, JSON, 배열) 저장CoreData, FileManager 추천
보안이 필요한 데이터 (비밀번호, 토큰 등)Keychain 추천
자주 변경되는 데이터 (실시간으로 업데이트되는 정보)UserDefaults는 즉시 동기화되지 않음

📌 최적의 활용법

  • UserDefaultsManager를 만들어 키 관리 및 접근 로직을 캡슐화
  • Codable을 활용하여 객체를 JSON으로 변환 후 저장
  • UserDefaults간단한 설정값 저장 용도로만 사용하고, 대량 데이터 저장은 피하기

💡 결론:
UserDefaults는 간단한 데이터 저장에는 유용하지만, 잘못 사용하면 성능 및 유지보수에 문제가 생길 수 있다. 올바른 패턴을 활용하면 더 효율적이고 안전하게 데이터를 관리할 수 있다.

👉 "UserDefaults를 무조건 쓰기보다, 어떤 데이터에 적절한지 고민하고 사용하는 것이 중요하다!"

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보