Room은 Android Project에 내부 저장소를 활용하여 DB처럼 활용하기 위하여 제공되는 Android Library이다. 자세한 내용은 Android 공식 문서에서 확인할 수 있기 때문에, 이 포스트에서는 Project에 적용하는 간단한 방법에 대해서만 다룰 예정이다.
App 단위 Gradle에 다음과 같이 라이브러리를 추가한다.
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"
다음과 같이 @Entity
를 활용하여 Room Database에서 사용할 데이터를 정의할 수 있다.
User.kt
@Entity(tableName="tb_user")
data class User {
@PrimaryKey var id: Int,
@ColumnInfo(name="first_name") var firstName: String?,
@ColumnInfo(name="last_name") var lastName: String?
}
DAO Interface를 정의하여 Database에서 해당 Entity에 접근하기 위한 객체를 만들고 AppDatabase를 정의한다.
UserDao.kt
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
AppDatabase.kt
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Koin을 활용하여 Room Instance를 Singleton 객체로 선언한다. 이는 Room 활용을 위한 Instance를 매번 생성하지 않고 Singleton 상태로 메모리에 유지한 상태로 의존성을 주입하기 위한 것이다.
AppModule.kt
single {
Room.databaseBuilder(
get(),
AppDatabase::class.java,
"app_database"
)
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
}
// User DAO 객체 생성
// 의존성 주입시 Database 자체보단 접근용 객체인 DAO를 전달하는 것이 좋으며, 해당 DAO도 Singleton으로 유지하도록 구조를 만들었다.
single { get<AppDatabase>().UserDao() }
이제 Koin의 AppModule.kt
에서 Room의 AppDatabase의 User 테이블에 접근하기 위한 UserDao를 주입할 수 있고, 다음과 같이 활용될 수 있다.
AppModule.kt
single { get<AppDatabase>().UserDao() }
// User Repository 객체에 User DAO 주입
single<UserRepository> { UserRepositoryImpl(get()) }
해당 코드에서 사용된 Repository에 대한 것은 나중에 별도의 포스트로 다를 예정이다.
Andoird Project에 Repository 패턴 적용하기
기본적인 Room 설정 방법을 다루어보았다. Room에 대한 더 다양한 활용방법은 Android 공식 문서에 자세히 서술되어 있으니, 필요에 따라 적용하면 좋을 것이다.