iOS UserDefaults 정리

호씨·2024년 12월 16일
0

이번에 프로젝트에 UserDefaults를 사용하게됬는데 딱히 사용한 적이 없는 UserDefaults에 대해서 따로 알아본 내용들을 정리만 한 내용들이다.

iOS UserDefaults 가이드

1. UserDefaults 기본 개념

UserDefaults는 iOS 애플리케이션에서 데이터를 영구적으로 저장하는 인터페이스다.

핵심 특징

  • 키-값 쌍으로 데이터 저장
  • 앱 종료 후에도 데이터 유지
  • 앱 삭제 시 데이터도 함께 삭제
  • 싱글톤 패턴으로 전체 앱에서 동일 인스턴스 공유

2. 주요 용도

2.1 설정 및 상태 관리

  • 사용자 기본 설정 (다크모드, 언어 설정)
  • 앱 최초 실행 여부
  • 로그인 상태 관리
  • 마지막 접속 시간 기록

2.2 캐시 및 임시 데이터

  • 캐시 데이터 관리
  • 간단한 사용자 프로필 정보
  • 최근 검색어 저장

3. 데이터 타입 지원

3.1 기본 데이터 타입

  • String
  • Integer
  • Float
  • Double
  • Bool

3.2 복합 데이터 타입

  • Array
  • Dictionary

3.3 특수 데이터 타입

  • Date
  • Data
  • URL

3.4 커스텀 객체

// Codable 프로토콜을 사용한 커스텀 객체 저장
struct UserProfile: Codable {
    let name: String
    let age: Int
}

// 저장
let profile = UserProfile(name: "홍길동", age: 25)
if let encoded = try? JSONEncoder().encode(profile) {
    UserDefaults.standard.set(encoded, forKey: "userProfile")
}

// 읽기
if let data = UserDefaults.standard.data(forKey: "userProfile"),
   let profile = try? JSONDecoder().decode(UserProfile.self, from: data) {
    print(profile.name, profile.age)
}

4. 장단점 분석

4.1 장점

  • 사용이 간단하고 직관적
  • 별도 설정 없이 즉시 사용 가능
  • 빠른 데이터 접근
  • 앱 재시작 후에도 데이터 유지
  • 작은 데이터 저장에 최적화

4.2 단점

  • 대용량 데이터 저장에 부적합
  • 복잡한 데이터 구조 저장 어려움
  • 보안에 취약 (암호화되지 않음)
  • 동기화 이슈 발생 가능

5. 주의사항

5.1 보안

  • 민감한 정보 저장 금지 (비밀번호, 개인정보)
  • 중요 데이터는 Keychain 사용 권장

5.2 코드 관리

// 키 값을 상수로 관리
struct UserDefaultsKeys {
    static let userProfile = "userProfile"
    static let isDarkMode = "isDarkMode"
    static let lastAccessTime = "lastAccessTime"
}

5.3 성능

  • 과도한 데이터 저장 시 성능 저하
  • 데이터 변경 시 동기화 고려

6. 대안적 저장 방식

저장 방식사용 케이스
CoreData복잡한 데이터 구조, 대용량 데이터
Keychain보안이 필요한 민감한 정보
File System큰 파일이나 문서
SQLite관계형 데이터베이스 필요 시

7. 활용 시나리오

7.1 온보딩 관리

class OnboardingManager {
    static let shared = OnboardingManager()
    
    var hasCompletedOnboarding: Bool {
        get {
            UserDefaults.standard.bool(forKey: "hasCompletedOnboarding")
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "hasCompletedOnboarding")
        }
    }
}

7.2 테마 설정

class ThemeManager {
    static let shared = ThemeManager()
    
    var isDarkMode: Bool {
        get {
            UserDefaults.standard.bool(forKey: "isDarkMode")
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "isDarkMode")
        }
    }
}

8. 성능 최적화

8.1 동기화 관리

// 변경 알림 수신
NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleDefaultsChanged),
    name: UserDefaults.didChangeNotification,
    object: nil
)

// 명시적 동기화
UserDefaults.standard.synchronize()

8.2 데이터 정리

class DataCleanupManager {
    static func cleanupOldData() {
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: "outdatedKey")
        // 필요한 정리 작업 수행
    }
}

9. 데이터 관리 전략

9.1 키 네이밍 규칙

// 도메인별 구분
struct UserDefaultsKeys {
    struct User {
        static let profile = "user.profile"
        static let settings = "user.settings"
    }
    
    struct App {
        static let lastVersion = "app.lastVersion"
        static let launchCount = "app.launchCount"
    }
}

9.2 백업 및 복구

class UserDefaultsBackup {
    static func backup() -> [String: Any] {
        return UserDefaults.standard.dictionaryRepresentation()
    }
    
    static func restore(from backup: [String: Any]) {
        for (key, value) in backup {
            UserDefaults.standard.set(value, forKey: key)
        }
    }
}

10. 정리

UserDefaults는 간단한 데이터 저장에 적합한 도구라고한다.

  • 작은 크기의 데이터 저장에 활용
  • 보안이 필요한 데이터는 다른 저장소 사용
  • 키 관리와 데이터 정리 규칙 수립
  • 성능과 동기화 이슈 고려

사실 개념적인것만 정리해놓고 실사용이나 내 프로젝트에서 어떻게 적용해야되는지는 아직 이해를 못한 상황인지라 내일중으로 튜터님께 찾아뵈서 사용법과 내가 찾은 개념들이 맞는지 여쭤볼 예정이다.

profile
이것저것 많이 해보고싶은 사람

0개의 댓글

관련 채용 정보