Android/랜덤리즘

[랜덤리즘] 관련 알고리즘 보이기/숨기기 기능 개발하기 -2

김 안개 2024. 2. 26. 19:45

SharedPreferences vs DataStore

처음에는 SharedPreferences 를 사용해서 데이터를 저장하려고 했는데, 공식문서에서 SharedPreferences 를 사용하는 것 보다는 DataStore 를 사용하는 것을 추천한다고 해서 SharedPreferences 대신 DataStore 를 사용하였다.

 


 

가장 처음 한 일은 만들려는 기능(관련 알고리즘 보이기/숨기기)이 어느 부분에 영향을 주는지를 알아보았다.

1) 현재 프로젝트의 구조 그려보기

 

현재 랜덤리즘의 구조를 간단히 그려보았을 때, 위의 사진과 같았다.

여기서 SettingFragment 을 통해 변경된 값이 Problem/SettingFragment 의 화면에 보여야하므로, 2개의 화면이 변경된 값에 영향을 받는 다는 것을 알게되었다.

 

그렇다면 SettingFragment 와 ProblemFragment 사이에서 어떠한 데이터 흐름을 가지는지 생각해보았다.

2) 데이터흐름 살펴보기

데이터 흐름

 

위의 사진처럼 작성한 데이터 흐름대로 코드를 작성해주었고, 생각했던 대로 기능 구현은 완료되었다!

 


🤔 의문점1

공식문서를 보며 작성하긴 하였으나, UseCase 에 최상위 변수들을 가지고 있어도 되는건지는 아직 의문이다 ..

일단 나는 ChangeTagStateUseCase 에서 최상위 변수로 DataStore 를 위한 위임생성과 key 를 선언해주었다.

 

// ChangeTagStateUseCase.kt

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
val TAG_STATE_KEY = booleanPreferencesKey("tag_state")

 

다른 분들의 코드를 살펴보며 수정해봐야겠다...

🤔 의문점2

ProblemFragment(문제를 보여주는 화면) 가 SettingViewModel 을 가지고 있어도 되는가?
일단 변경된 값이 SettingFragment (설정화면) 에서도 유지됨을 사용자에게 보여주어야 하므로 SettingViewModel 에 DataStore 의 값을 읽어오는 Flow 를 작성해주었다.

 

// SettingViewModel.kt

class SettingViewModel @Inject constructor(
    private val changeTagStateUseCase: ChangeTagStateUseCase,
    private val getTagStateUseCase: GetTagStateUseCase
) : ViewModel() {
    val tagState: Flow<Boolean> = getTagStateUseCase.invoke()
    
    ...
}

 

그런데 이 값을 ProblemFragment 에서도 사용해도 되는 것인가 ....! 

그럼 ProblemViewModel 안에서 DataStore 에 접근하여 세팅값을 읽어와도 되는 것인가 ...? 그런데 DataStore 는 1개의 인스턴스를 생성하기때문에 ProblemViewModel 에서도 DataStore 에 접근하여 데이터를 가지고 와도 될 것 같기도하다!

 

일단 이 부분은 ViewModel 역할에 대한 개념이 부족하다고 판단되어서 ViewModel 을 조금 더 알아봐야겠다.

그리고 다른 사람들의 코드도 봐야겠다 ...

 

이 의문점에 대한 포스팅을 작성하였다!

 

[랜덤리즘] 설정화면에서 변경한 값을 다른 화면에서 사용해도 될까?

지난번 포스팅에서 2가지 의문점을 가졌었는데, 그 중 2번째 의문점에 대해서 작성해보려고 한다. 지난번 의문점은 위의 사진을 보면 알 수 있다. 포스팅은 여기! [랜덤리즘] 관련 알고리즘 보이

w36495.tistory.com

 

아무튼 관련 알고리즘 보이기/숨기기 기능 구현 완료!

 


 

결과 화면

(왼) '관련 알고리즘 보이기' 설정했을 때 / (오) '관련 알고리즘 숨기기' 설정했을 때

 


 

참고

 

앱 아키텍처: 데이터 영역 - Datastore - Android 개발자  |  Android Developers

데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.

developer.android.com