이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.
작성 시점: 2018-04-28
안드로이드 앱을 개발하다보면 SharedPreference를 다양한 곳에 쓰는 일이 많다.
로그인한 유저의 정보를 저장한다던지, 클라이언트 단 FCM Token 을 저장한다던지... 꽤나 많을 것이다.
이번 글에서는 Dagger 를 이용해 SharedPreference 를 사용할 수 있는 PreferenceRepository 를 만드려고 한다.
SharedPreference 를 쓰는 이유는 다양하지만, 이번 글에서는 로그인한 유저의 정보를 저장하고, 가져올 수 있게 Dagger를 이용하여 PreferenceRepository 를 제작하려고 한다.
기본적인 Dagger 사용법이나 Module, Component 설명은 Inject Retrofit with Dagger, a Dependency injection library 글을 참고하면 될 것 같다.
먼저, Dagger 에 Inject 할 PreferenceRepository 를 만든다.
public interface PreferenceRepository {
MemberBean getLoginMemberBean();
void setLoginMemberBean(MemberBean memberBean);
}
그리고 실제로 SharedPreference 코드를 구현하는 PreferenceRepositoryImpl 를 만든다.
@Singleton
public class PreferenceRepositoryImpl implements PreferenceRepository {
private RPreference mPreference;
private Gson mGson = new Gson();
private static String PREF_MEMBER_BEAN = "53bb19f0-fbe7-4001-b0b3-77c48e6ac14f";
@Inject
public PreferenceRepositoryImpl(MainApplication application) {
mPreference = RPreference.getInstance(application);
}
@Override
public MemberBean getLoginMemberBean() {
String jsonStr = mPreference.getString(PREF_MEMBER_BEAN);
MemberBean memberBean = new MemberBean();
if (isNotEmpty(jsonStr)) {
memberBean = mGson.fromJson(jsonStr, MemberBean.class);
}
return memberBean;
}
@Override
public void setLoginMemberBean(MemberBean memberBean) {
String jsonStr = mGson.toJson(memberBean);
mPreference.put(PREF_MEMBER_BEAN, jsonStr);
}
}
생성자로는 MainApplication 객체를 받고, 그 다음에는 PreferenceRepository 에 있던 메서드를 구현한다. MemberBean 자체를 저장할 수는 없어 내부적으로 Gson 을 사용하여 String로 변환하여 저장하였다.
참고로 빠른 개발을 위해 RichUtilsKt 에 있는 RPreference 를 사용하였다.
@Module
public class AppProvidesModule {
@Provides
@Singleton
PreferenceRepository providePreferenceRepository(PreferenceRepositoryImpl impl) {
return impl;
}
@Provides
@Singleton
PreferenceRepositoryImpl providePreferenceRepositoryImpl(MainApplication application) {
return new PreferenceRepositoryImpl(application);
}
}
실제 앱에서 사용할 부분은 PreferenceRepository 이나 실제 구현체인 PreferenceRepositoryImpl 가 필요하기 때문에, 양쪽 클래스 둘 다 @Provides 를 통해 Dagger에 주입한다.
이제 Activity거나 ViewModel이거나 상관없이 @Inject PreferenceRepository mPreferenceRepository;
한 줄이면 PreferenceRepository 에 접근할 수 있게 되었다.
if (mPreferenceRepository.getLoginMemberBean().getMemNo() != 0) {
startActivity(MainActivity.class);
finishAllActivities();
return;
}
사용할 때는 이런 식으로 사용하면 된다.