iOS - AppStorage & SceneStorage (SharedPreferences in Android)

2023. 10. 31. 01:23코딩일기/iOS

앱을 다시 시작해도 유지되어야 하는 소량의 데이터가 있다. 이것은 앱이 저장을 하고 있어야 가능하다.

SwiftUI는 소량의 데이터를 지속적으로 저장을 하기 위한 두 개의 프로퍼티 래퍼가 있다.

@SceneStorage@AppStorage 가 있다.

 

@SceneStorage 즉, 화면 저장소는 앱 내의 각 화면마다 데이터의 복사본을 갖는다. 앱 내의 다른 화면에서도 그 데이터에는 접근이 불가능하다.

반면 @AppStorage, 앱 저장소는 앱 전체에서 접근이 가능한 데이터를 저장한다. UserDefaults를 기반으로 구축되었다. 

UserDefaults는 소량의 데이터를 키-값 쌍(key-values)으로 저장하는 데 사용한다. 

 

@SceneStorage  @AppStorage 둘 다 Bool, Int, Double, String, URL 및 데이터 타입에 대한 저장을 지원한다.

 

UserDefaults에 관한 자세한 정보는 이곳을 참고!

 

UserDefaults | Apple Developer Documentation

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

developer.apple.com

공식문서를 읽다보니 이목을 끄는 단어가 있었다. preference!! (not null이라는 뜻은 아니고 강조ㅎㅎ)

안드로이드에서도 key-values 로 간단한 데이터를 저장하는 SharedPreferences 라는 API가 있다. iOS의 @SceneStorage, @AppStorage 와의 비교는 아래에서 조금 더 자세히 해보도록 하자.

 

@SceneStorage  @AppStorage 사용법은 간단하다!

이전에 상태 프로퍼티(@State) 를 사용해본 경험이 있다면, 다음과 같은 코드를 본 적이 있을 것이다.

struct AppStorageView: View {
    
    @State var editorText: String = "Sample Text"
    
    var body: some View {
        TextEditor(text: $editorText)
            .padding(30)
            .font(.largeTitle)
    }
}

 @State 대신 @SceneStorage  @AppStorage 를 쓰고 파라미터로 원하는 키값을 전해주면 된다.

import SwiftUI

struct SceneStorageView: View {
    
    @SceneStorage("mytext") private var editorText: String = ""
    
    var body: some View {
        TextEditor(text: $editorText)
            .padding(30)
            .font(.largeTitle)
    }
}
import SwiftUI

struct AppStorageView: View {
    
    @AppStorage("mytext") var editorText: String = "Sample Text"
    
    var body: some View {
        TextEditor(text: $editorText)
            .padding(30)
            .font(.largeTitle)
    }
}

@SceneStorage  @AppStorage  cmd 클릭해서 따라가 보면 다음과 같은 설명들을 찾아 볼 수 있다.

SceneStorage
Parameter key: a key used to save and restore the value.

AppStorage
- Parameters:
  - key: The key to read and write the value to in the user defaults store.

다음은 안드로이드의 SharedPreferences에 대한 간단한 소개다.

 

SharedPreferences로 단순 데이터 저장하기  |  Android 개발자  |  Android Developers

DataStore는 로컬 데이터를 저장하는 최신 방법을 제공합니다. SharedPreferences 대신 DataStore를 사용해야 합니다. 자세한 내용은 DataStore 가이드를 참고하세요. SharedPreferences로 단순 데이터 저장하기 컬

developer.android.com

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

위 공식문서에는 이렇게 나와있다.

키값을 앱 고유의 ID로 설정할 것을 권장한다. (예: com.example.myapp.PREFERENCE_FILE_KEY)

 

파라미터로 키값을 이용하여 간단한 데이터를 저장하는 것이 iOS에서의 방법과 매우 유사하다.

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
    putInt(getString(R.string.saved_high_score_key), newHighScore)
    apply()
}

위의 방법들을 활용하여 앱에서 간단한 정보들, 예를 들면 자동로그인 여부와 같은 값을 저장하여 활용하면 유용하다고 생각된다.

 

 


 

이번에 정리를 하며 거의 처음으로 공식문서를 읽어보았다. 그리고 또 거의 처음으로 영어로 읽어보았다. 익숙하지 않고 빨리 읽지 못한다는 이유로 영어로 읽는 것을 피해왔는데, 저번 멘토링에서 영어로 공식문서를 참고하는 모습을 보며 나도 도전해보기를 마음먹고 실천해봤다.

영어도 좋아하고, 나름 토익 800+ 면서 그동안 왜 겁만 먹었을까. 정리도 열심히하고 공식문서를 영어로 읽는 것에도 익숙해져야겠다~~ 

반응형