IT/Android

[Android] (2) SharedPreferences의 사용 - Kotlin

Hodie! 2021. 7. 26. 07:15
반응형

SharedPreferences 실제 사용

 

실제 사용 부분은 구글링을 통해 많은 부분 블로그들을 참고하였다.

 

1. build.gradle/app

implementation 'androidx.preference:preference-ktx:1.1.1'

먼저 build.gradle sync부터 진행해준다

 

2. PreferenceHelper.kt

object PreferenceHelper {

    fun defaultPrefs(context: Context): SharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(context)

    private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
        val editor = this.edit()
        operation(editor)
        editor.apply()
    }

    operator fun SharedPreferences.set(key: String, value: Any?) {
        when (value) {
            is String? -> edit {it.putString(key, value)}
            is Int? -> edit {
                if (value != null) {
                    it.putInt(key, value)
                }
            }
            is Boolean? -> edit {
                if (value != null) {
                    it.putBoolean(key, value)
                }
            }
            is Float? -> edit {
                if (value != null) {
                    it.putFloat(key, value)
                }
            }
            is Long? -> edit {
                if (value != null) {
                    it.putLong(key, value)
                }
            }
            else -> throw UnsupportedOperationException("Error")
        }
    }

    @Suppress("UNCHECKED_CAST")
    operator fun <T> SharedPreferences.get(key: String, defaultValue: T?= null): T {
        return when (defaultValue) {
            is String, null -> getString(key, defaultValue as? String) as T
            is Int -> getInt(key, defaultValue as? Int ?: -1) as T
            is Boolean -> getBoolean(key, defaultValue as? Boolean ?: false) as T
            is Float -> getFloat(key, defaultValue as? Float ?: -1f) as T
            is Long -> getLong(key, defaultValue as? Long ?: -1) as T
            else -> throw UnsupportedOperationException("Error")
        }
    }
}

SharedPreferences를 관리하는 PreferenceHelper object를 만들어서

SharedPreferences를 관리할 때 사용하는 정보를 저장하는 set, 정보를 불러오는 get operator를 생성한다. 

 

Kotlin에서는 배열이나 맵의 원소 접근시 대괄호를 사용할 수 있고, 이러한 인덱스 연산자를 사용하기 위해 operator를 만들어 준 것이다. 호출 시 Type에 따라 저장/불러오기를 할 수 있도록 하며, 확장함수 edit를 만들어 사용한다.

 

3. User.kt

data class User(
    var idToken : String? = null,
    var refreshToken : String? = null,
    var email:String? = null,
    var password :String? = null,
    var nickname:String? = null,
    var gender :String? = null,
    var profilePhoto: Uri? = null
)

저장하고 불러올 요소가 담긴 Data Class를 만들어준다.

 

4. SharedManager.kt

import com.example.hometrain.PreferenceHelper.set
import com.example.hometrain.PreferenceHelper.get

class SharedManager(context: Context) {
    private val prefs: SharedPreferences = PreferenceHelper.defaultPrefs(context)

    fun saveCurrentUser(user: User) {
        prefs["idToken"] = user.idToken
        prefs["refreshToken"] = user.refreshToken
        prefs["email"] = user.email
        prefs["nickname"] = user.nickname
        prefs["gender"] = user.gender
        prefs["profilePhoto"] = user.profilePhoto
    }

    fun getCurrentUser() : User {
        return User().apply {
            idToken = prefs["idToken", ""]
            refreshToken =  prefs["refreshToken", ""]
            email = prefs["email", ""]
            nickname = prefs["nickname", ""]
            gender = prefs["gender", ""]
            profilePhoto = prefs["profilePhoto"]
        }
    }
}

SharedPreference를 활용해 User에 Data를 저장하고 불러오는 함수를 선언한다.

1번째 글에서도 언급했듯이, 키-값 쌍으로 데이터를 저장한다.

 

5. MainActivity

private val sharedManager : SharedManager by lazy { SharedManager(this) }
// Fragment인 경우 private val sharedManager : SharedManager by lazy { SharedManager(requireContext()) }

val currentUser = User().apply {
                name = (EditText ID).text.toString().trim()
                age = (EditText ID).text.toString().toInt()
                email = (EditText ID).text.toString().trim()
                password = (EditText ID).toString().trim()
}
sharedManager.saveCurrentUser(currentUser)

val currentUser = sharedManager.getCurrentUser()
            val result = "name: ${currentUser.name} \n" +
                    "age: ${currentUser.age} \n" +
                    "email: ${currentUser.email} \n" +
                    "password: ${currentUser.password} \n"
(텍스트뷰).text = result

저장하고 불러오는 코드부분이다.

통신 후 로그인이 성공하고 나서 전달받은 Response을 User Data에 apply해주고 저장하도록

위의 코드를 적절히 변형시킨다.

 

해당 정보가 필요한 부분을 sharedManager.getCurrentUser()로 가져오면 된다.

 

[참고 블로그]

[Android/Kotlin] 안드로이드 SharedPreferences 잘 사용하기

[Kotlin_Android] SharedPreferences로 로그인 정보 저장 보여주기

반응형