안드로이드 앱 개발

Repository Pattern (레포지터리 패턴) 데이터베이스에 접근하는 방법 본문

안드로이드앱

Repository Pattern (레포지터리 패턴) 데이터베이스에 접근하는 방법

스텝바이스텝안드로이드 2021. 7. 16. 02:53

데이터베이스 접근에는

구글의 앱 아키텍처 지침에서 권장하는 Repository Pattern을 사용하는게 좋다.

 

레포지터리 클래스는 레포지터리(데이터 저장소)를 구현한다. 

로컬 데이터베이스나 원격 서버로부터 특정 데이터 셋을 가져오거나 저장하는 방법을 결정한다.

그리고 UI 코드에서는 레포지터리에 모든 데이터를 요청한다.

 

1. Repository에서 데이터 가져오기

1) Repository class 생성하기

class CrimeRepository private constructor(context: Context){

    companion object {
        private var INSTANCE: CrimeRepository? = null

        fun initialize(context: Context){
            if (INSTANCE == null){
                INSTANCE = CrimeRepository(context)
            }
        }

        fun get():CrimeRepository {
            return INSTANCE?:
            throw IllegalStateException("CrimeRepository must be initialized")
        }
    }
}

* 위 Repository는 싱글톤이다. 즉, 앱이 실행되는 동안 하나의 인스턴스만 생성된다는 의미다.

-> 액티비티나 프래그먼트의 생명주기 상태가 변경되어도 계속 유지될 수 있다. (앱이 삭제되면 삭제)

따라서, 앱이 시작될 때, Repository가 생성되게 해야한다.

 

2) 앱이 시작될 때, 싱글톤 (Singleton) Repository 생성하기

Application을 슈퍼클래스(부모)로 갖는 클래스를 형성하고 이 클래스가 onCreate될 때(앱이 실행될 때), Repository가

생성되게 한다.

class CriminalIntentApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        CrimeRepository.initialize(this)
    }
}

그 후, Manifest.xml에서 application 이름을 위 클래스로 지정해준다.

 <application
        android:name=".CriminalIntentApplication"
        android:allowBackup="true"
        ...>
        </application>

위까지 하면 Repository 생성 끝 

 

* Repository 활용하기

i) Room DB, DAO를 Repository에 생성해서 사용하기

class CrimeRepository private constructor(context: Context){

    private val database : CrimeDatabase = Room.databaseBuilder(
        context.applicationContext,
        CrimeDatabase::class.java,
        DATABASE_NAME
    ).build()

    private val crimeDao = database.crimeDao()
    
    //Dao의 함수들을 여기에 생성해서 사용하면 됨
    
    ...
    }

ii) Viewmodel에서 Repository instance를 생성해서 사용하기

class CrimeListViewModel: ViewModel() {

    private val crimeRepository = CrimeRepository.get()
	
    val crimeListLiveData = crimeRepository.getCrimes()
}

 

2. Repository에 데이터 저장하기

 

* 추후 수정 예정