👍 Repository 만들기

  • Repository를 작성하여 실제 호출후 사용할 수 있도록 해준다.
class RoomRepository(application: Application) {

    private var userDao: UserDao

    init {
        val database = RoomDatabase.getInstance(application)!!
        userDao = database.userDao() // 데이터 베이스에서 dao를 호출한다
    }

    fun userInsert(entity: User) {
        InsertAsyncTask(userDao).execute(entity)
    }
    fun userUpdate(entity: User) {
        UpdateAsyncTask(userDao).execute(entity)
    }
    fun userDelete(entity: User) {
        DeleteAsyncTask(userDao).execute(entity)
    }
    fun getUser(id: String): LiveData<User>? {
        return userDao.getUser(id)
    }

    private class InsertAsyncTask<TE, TDO : BaseDao<TE>>(private val dao: TDO) : AsyncTask<TE, Void, Void>() {
        override fun doInBackground(vararg entity: TE): Void? {
            dao.insert(entity[0])
            return null
        }
    }
    private class UpdateAsyncTask<TE, TDO : BaseDao<TE>>(private val dao: TDO) : AsyncTask<TE, Void, Void>() {
        override fun doInBackground(vararg entity: TE): Void? {
            dao.update(entity[0])
            return null
        }
    }
    private class DeleteAsyncTask<TE, TDO : BaseDao<TE>>(private val dao: TDO) : AsyncTask<TE, Void, Void>() {
        override fun doInBackground(vararg entity: TE): Void? {
            dao.delete(entity[0])
            return null
        }
    }
}

AnyncTask는 백그라운드에서 작동하는 쓰레드인데 이를 사용하지 않고 UI-thread에서 작동하면 오류가 발생한다.
이 Repository를 선언하고 함수를 호출하여 User DB를 사용할 수 있다.

✌ MVVM에서 사용하기

abstract class BaseViewModel protected constructor(application: Application) : AndroidViewModel(application) {
    protected val repository: RoomRepository = RoomRepository(application) // Repository 선언
}
class ProfileViewModel(application: Application) : BaseViewModel(application) {

    var id: MutableLiveData<String> = MutableLiveData()

    fun getUser(id: String) {
        this.id = repository.getUser(id) // 함수 호출
    }
}
class ProfileActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel.getUser("aaa")

        viewModel.id.observe(this, Observer {
             // 이벤트
        })

    }
}

왜 getUser의 반환값을 LiveData로 했는지 알아 볼수 있는 부분이다.
유저 값을 반환 받아 MutableLiveData의 값이 바뀌면 이벤트를 실행해 주는 방식으로 쉽게 작성하면 된다.

하지만 여기서 문제가 발생한다. 만약 반환된 User값이 Null처럼 잘못된 값이라면 어떻게 될까?
당연히 이벤트 처리 부분에서 오류가 발생한다.

이럴땐 RxJava를 사용해주면 된다. Room과 SQLITE의 차이점이자 Room의 장점중 하나가 RxJava를 사용할 수 있다는 점이다. RxJava는 다음 챕터에서 다루겠다.