-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Seminar/7 #10
base: main
Are you sure you want to change the base?
Conversation
- SharedPreferences를 활용한 자동 로그인 구현
- SharedPreferences를 활용한 자동 로그인 구현
- Navigation Componenet를 활용한 온보딩 구현
- Room을 사용한 자동 로그인 구현 - StateFlow 사용한 상태 갱신
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
최고의 스승님 (_ _)
@@ -33,4 +33,8 @@ class SopthubDataStore @Inject constructor( | |||
var autoLogin: Boolean | |||
set(value) = dataStore.edit { putBoolean("AUTO_LOGIN", value) } | |||
get() = dataStore.getBoolean("AUTO_LOGIN", false) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sharedPreference보다 dataStore를 사용하였을 때의 이점이 무엇이 있나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DataStore를 공부해보려고 하긴 했는데, 결과적으로 보면 저 dataStore라는 애는 SharedPreferences입니다. 왜냐면 context.getSharedPreferences() 메서드로 가져오기 때문이죠.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제가 공부해보려고 한 이유는 이런 3가지 특징이 있어서라고 합니다.
- DataStore는 코루틴과 Flow를 통해 읽고 쓰기에 대한 비동기 API를 제공한다.
- DataStore는 UI 스레드를 호출해도 안전하다.
- runtime exception으로부터 안전하다.
@AndroidEntryPoint | ||
class OnBoardingFirstFragment : BaseFragment<FragmentOnBoardingFirstBinding>() { | ||
override val TAG: String | ||
get() = OnBoardingFirstFragment::class.java.simpleName |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TAG의 역할은 무엇인가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 1차 세미나 과제를 할 때 생명주기를 Log로 남기고 싶어서 사용한 TAG입니다. OnBoardingFirstFragment::class.java의 simpleName은 말 그대로 이 Fragment의 name, 즉 OnBoardingFirstFragment
가 됩니다. 따라서 이 TAG는 BaseFragment에서 생명주기 콜백 메서드(onCreateView, onViewCreated 등)에서 Log를 남길 때 TAG로서 작용하게 됩니다. 저같은 경우는 lifecycle에 observer를 붙여 생명주기마다 Log를 남기도록 했습니다.
위 링크는 제가 DefaultLifecycleObserver를 상속받아 구현한 Observer입니다.
private var _isEmpty = SingleLiveEvent<Boolean>() | ||
val isEmpty: LiveData<Boolean> get() = _isEmpty | ||
|
||
private var _isEmailIncorrect = SingleLiveEvent<Boolean>() | ||
val isEmailIncorrect: LiveData<Boolean> get() = _isEmailIncorrect |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LiveData를 사용할 때 get()이 필요한 이유가 무엇인가요? 값이 계속 변경될거라면 MutableLiveData를 사용해도 되지 않나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
get()을 사용해 가져오는 것은 값을 계속 변경시키기의 목적보다는 클래스 외부에서 값을 마음대로 변경하지 못하도록 하는 것에 더 큰 목적이 있습니다. 저의 경우 일반적으로 _
prefix가 붙은 MutableLiveData 변수는 ViewModel 클래스 안에서만 접근 가능한 private
으로 지정하고 ViewModel 클래스 외부에서 LiveData의 값을 참조하고 싶을 경우에는 val로 선언해 set(value)를 불가능하게 한 뒤 get()으로 원본 데이터(_
prefix가 붙은)의 값을 가져오는 형태입니다. 이렇게 하면 무분별하게 ViewModel 클래스의 외부에서 MutableLiveData 값을 변경하는 행위를 막을 수 있습니다. 이렇게 하면 LiveData 값의 조작은 ViewModel 클래스 안에서만 일어나게 됩니다. 따라서 추후에 유지보수를 하게 되거나 코드에 수정을 하거나 에러가 발생했을 때 LiveData의 값을 조작하는 부분은 ViewModel 클래스 안에만 있으니 ViewModel 클래스 코드만 보면 된다는 장점이 있다고 생각합니다.
📌 Related Issue
📝 What's-New
➕ Additional
1차 세미나
2차 세미나
3차 세미나
4차 세미나
7차 세미나