Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
SwiftUI/SwiftUI(Basic)

[52] @AppStorage / UserDefaults

by Toughie 2023. 5. 7.

⭐️@AppStorage / UserDefaults⭐️

 

앱을 사용하다가 잠시 껐을 때 (혹은 꺼졌을 때) 데이터가 저장되어야 하는 경우가 있다. (사실 대부분이겠지만..)

방대한 데이터나 정말 중요한 데이터들은 코어데이터나 서버를 활용해야겠지만

작은 데이터를 손쉽게 저장할 수 있는 방법 중 하나가 바로 UserDefaults이다.

 

UserDefaults는 앱이 실행되는 동안 데이터를 유지하기 위해 사용되는 인터페이스이다.

일반적으로 키-값 쌍으로 저장되는 데이터를 관리하며 키-값 쌍을 통해 접근할 수 있다. (forKey)

UserDefaults를 사용하면 앱의 설정 정보나 사용자의 환경 설정, 최근 검색어 등을 저장할 수 있다.

이 정보는 앱이 종료되어도 유지되며, 앱이 재실행되면 다시 불러올 수 있다.

//  Created by Toughie on 2023/05/07.
//

import SwiftUI

struct AppStoragePrac: View {
    //옵셔널 스트링
    @State var currentUserName: String?
    
    var body: some View {
        VStack(spacing: 20) {
        
            //nil coalescing을 활용해 placeHolder처럼
            Text(currentUserName ?? "Add Name Here")
            
//            if let name = currentUserName {
//                Text(name)
//            }
            //버튼을 누르면 "Toughie"가 currentName에 할당됨.
            Button("SAVE") {
                let name = "Toughie"
                currentUserName = name
                //UserDefaults를 활용해 "name"이라는 키로 name을 저장(여기선 "Toughie")
                UserDefaults.standard.set(name, forKey: "name")
            }
        }
        //앱을 껐다가 다시 킬 때 UserDefaults에 저장 되어 있는 데이터를 불러옴 
        .onAppear {
            currentUserName = UserDefaults.standard.string(forKey: "name")
        }
    }
}

자 그럼 @AppStorage를 활용해보자!

//  Created by Toughie on 2023/05/07.
//

import SwiftUI

struct AppStoragePrac: View {
    
//    @State var currentUserName: String?
    @AppStorage("name") var currentUserName: String?
    
    var body: some View {
        VStack(spacing: 20) {
            
            Text(currentUserName ?? "Add Name Here")
            
//            if let name = currentUserName {
//                Text(name)
//            }
            
            Button("SAVE") {
                let name = "Poppy"
                currentUserName = name
            }
        }
    }
}

훨씬 간단하게 같은 기능을 활용할 수 있다 :)

 

또한 @AppStorage로 선언한 변수는 앱 내 어떤 뷰에서도 접근할 수 있다.

(UserDefaults에 저장되기 때문에, 앱 내 어느 뷰에서든 이 변수를 가져와 사용할 수 있다.)

*다만 권장되지는 않음_ 환경객체 사용이 더 안전하고 뷰 간 종속성도 최소화 할 수 있기 때문.

 

@AppStorage와 UserDefaults.

 

@AppStorage는 UserDefaults의 간편한 래퍼(wrapper)이며, 구현 방법은 UserDefaults와 유사하다.

@AppStorage를 사용하면 간단하게 로컬 데이터를 저장하고 검색할 수 있으며, 데이터가 변경될 때마다 자동으로 UI가 업데이트된다.

하지만 @AppStorage는 UserDefaults의 기능을 일부 제한한다.

ex. @AppStorage로 사용자 설정값을 저장하면 앱을 삭제하고 다시 설치하면 이전 설정값이 유지되지 않는다.

이러한 경우에는 UserDefaults를 직접 사용하는 것이 더 적합하다.

 

또한 @AppStorage는 뷰에서만 사용 가능하므로, 비 UI 관련 데이터를 저장하기에는 적합하지 않을 수 있다.

 

따라서, 간단하고 빠르게 UI와 관련된 데이터를 저장하고 검색할 때 @AppStorage를 사용할 수 있고,

보다 복잡한 경우에는 UserDefaults를 직접 사용하는 것이 더 적합하다!