Using PreferenceRepository with Dagger 2

WindSekirun (wind.seo)·2022년 4월 26일
0

이 글은 기존 운영했던 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 글을 참고하면 될 것 같다.

PreferenceRepository, PreferenceRepositoryImpl 구현

먼저, 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 를 사용하였다.

@Provides 로 Dagger 에 의존성 주입

@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;
}

사용할 때는 이런 식으로 사용하면 된다.

profile
Android Developer @kakaobank

0개의 댓글