본문 바로가기

TIL

[TIL] Kotlin SharedPreference

[오늘 배운 내용]

-1- SharedPreference

  • SharedPreference란?
    • 키 - 값 데이터의 형태로 값을 저장하는 것인데, 앱 내부에 파일형식으로 저장을 통해서 앱이 꺼져도 데이터가 사라지지 않도록 보존할 수 있게 해준다. 
    • SharedPreference는 주로 프로그램의 설정 정보(사용자의 옵션 선택사항이나 프로그램의 구성정보) 등과 같이 간단한 값을 저장할 때 주로 사용한다.
    • SharedPreference는 응용 프로그램의 고유한 정보이므로 외부에서는 읽을 수 없다.

 

 

예제

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        binding = ActivityMainBinding.inflate(layoutInflater)
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        loadData()
        binding.button.setOnClickListener {
            saveData()
        }
    }
    private fun saveData() {
        val pref = getSharedPreferences("pref",0)
        val edit = pref.edit()
        edit.putString("name",binding.editTextText.text.toString())
        edit.apply()
    }

    private fun loadData() {
        val pref = getSharedPreferences("pref",0)
        binding.editTextText.setText(pref.getString("name",""))
    }
}
  • saveData()
    • getSharedPreferences() "pref"이라는 name을 지정하는 mode 0 (MODE_PRIVATE) 객체를 생성한다
    • val edit = pref.edit 을 통해 pref의 SharedPreferences 객체가 수정 되고 .apply를 통해 수정된 내용을 저장한다.
    • putXXX ->  XXX = 타입의 형태로 Key, Value 값을 지정해주어서 Key에 해당하는 Value를 저장한다. 
    • mode?
      • 0 -> MODE_PRIVATE 기본 모드로, 생성한 애플리케이션만 해당 SharedPreferences에 접근할 수 있다. 다른 애플리케이션은 해당 SharedPreferences에 접근할 수 없다.
      • 1 -> MODE_WORLD_READABLE 다른 애플리케이션도 해당 SharedPreferences를 읽을 수 있도록 허용한다. 하지만 이 모드는 보안상의 이유로 권장되지 않으며 API17 레벨부터는 Depreacated 되었다.
      • 2 -> MODE_WORLD_WRITEABLE 다른 애플리케이션도 해당 SharedPreferences를 수정할 수 있도록 허용한다. 마찬가지로 보안상의 이유로 권장되지 않으며, API17 레벨부터 Deprecated 되었다.
      • 4 -> MODE_MULTI_PROCESS 여러 프로세스가 동시에 해당 SharedPreferences에 접근할 수 있는 환경에서 사용된다. 하지만 안드로이드 API 23 부터는 모든 애플리케이션의 기본 동작이 멀티 프로세스를 지원하므로, 일반적으로 사용되지 않는다.
      • 32768 -> MODE_APPEND 이미 존재하는 SharedPreferences에 데이터를 추가할 때 사용된다. 이 모드를 사용하면 기존 데이터에 덮어쓰지 않고 추가된다.
  • loadData()
    • savaData()에서 데이터를 넣어둔 sharedPreferences과 일치하는 name의 객체를 생성해준다. 
    • getString을 통해 저장되어져 있는 Key에 접근하여 Value값을 가져온다.
    • viewBindng을 통해 editText의 Text를 sharedPreferences에서 가져온 값으로 바꾸어 주면 끝.

 

sharedPreferences에 값을 저장한 후 확인 방법

  • Android Studio 내에서 해당 값이 잘 등록되어있는지 확인하려면 AndroidStudio 우측 하단에 DeviceExplorer 에 들어가서 data / data / 패키지이름 / shared_prefs 폴더안에 xml의 형식으로 저장된다. 해당 파일은 앱이 삭제되기 전까지 존재한다.

키와 값이 저장되어 있는 XML파일

 

 

  • 회원 가입시에도 SharedPreferences로 Activity간의 데이터를 넘겨 받는 경우도 있었는데, Fragment와의 데이터 이동에는 SharedPreferences 를 사용하지 않았었다.

Fragment에서 SharedPreferences가 사용되지 않는 이유

  • 라이프사이클 관리
    • Fragment의 라이프사이클은 Activity의 생명주기에 영향을 받는다, Fragment가 화면 회전 또는 재생성 등의 이벤트로 인해 파괴 및 재생성이될 때, SharedPreferences에 저장된 데이터를 유지하려면 onSaveInstanceState() 메서드에서 데이터를 보관하고 onActivityCreated()메서드에서 복원하는 등의 추가적인 처리가 필요하다
  • 범위 (scope) 관리
    • Fragment는 다른 Fragment와 공유되는 경우가 많은데, SharedPreferences는 앱 전체 수준의 저장소이므로, Fragment 간에 데이터를 공유하기 위해 SharedPreferences를 사용하면 데이터의 범위가 너무 넓어질 수 있으므로 ViewModel, LiveData, ResultListener 등을 활용하여 데이터를 공유하는 것이 권장된다.
  • 비동기성과 성능
    • SharedPreferences는 동기적인 API를 제공한다. 따라서 I/O 작업을 수행할 때 호출된 함수가 블로킹 되어 다른 작업이 중단될 수 있다. 이러한 동작은 사용자 인터페이스의 응답성을 저하시킬 수 있는 반면, 비동기적인 방식으로 데이터를 관리할 수 있는 라이브러리를 사용하면 성능과 사용자의 편의성을 향상시킬 수 있다.
  • 단일 책임 원칙
    • Fragment는 주로 UI 관련 로직을 처리하는 데 집중되어야 한다. SharedPreferences와 같은 영구 저장소와 관련된 로직은 보다 일반화된 클래스에서 분리하여 담당하는 것이 바람직하다.

 

 

 

 

 


 

[오늘 복습한 내용]

1. 어제 Spinner의 CustomAdapter에 대해서 애매하게 끝내고 마무리해서 오늘 더 깊이 공부해봤으나, 아직도 정확하게 이해하지 못했다. 확장함수가 어렵다

 


[오류,에러 등등]

1. 따로 없었다

 

 


[느낀 점]

1. 블로그 검색하다 보면 몇번 보았던 블로그가 계속해서 나온다. 그런 블로그 들을 보다보면 정리를 잘하는 것도 있지만 글을 잘 쓰시는 능력들이 부럽고 신기하다. 나도 글을 잘 쓸 수 있도록 신경을 써봐야겠다

 

2. 며칠 전에, 지난 주에, 지난 달에 배운것들을 누적복습을 하고 있지 않고 계속 새로운 것들을 학습하기에 급급한 느낌이다. 나중에 다 잊어버릴 것 같아서 시간 날 때마다 복습하는 시간을 갖도록 해야겠다.

 

 


[Reference]

 

// SharedPreference

https://aries574.tistory.com/437

https://android-dev.tistory.com/28