[Android] Room DB 사용법 및 예제 - Kotlin
오늘은 안드로이드의 Room을 이용해 LocalDB를 구성한 예제를 소개하려고 한다.
Room에는 다음과 같은 3가지 개념이 존재한다.
- Database (데이터베이스)
- Entity ( 데이터베이스 내의 테이블 )
- DAO ( 데이터베이스에 접근하는 함수. insert, update, delete 등등 )
이 개념을 가지고 Room을 이용해 보자.
먼저, Room을 이용하기 위해선, build.gradle에 다음과 같이 추가하자.
implementation 'androidx.room:room-runtime:2.2.6'
kapt 'androidx.room:room-compiler:2.2.6'
그리고 Entity를 구성해보자.
다음과 같이 History라는 데이터클래스 파일을 만들고 class위에 Entity 어노테이션을 추가하여
Entity로 사용할 것을 명시하자.
@Entity
data class History (
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "keyword") val keyword: String?
)
그리고 DAO를 만들어 데이터베이스 테이블에 쿼리로 접근할 수 있도록 인터페이스를 만들자.
다음과 같이 @Dao 어노테이션을 추가하여 Dao로 사용할 것을 명시한 후
HistoryDao 인터페이스를 만들어 주었다.
@Dao
interface HistoryDao {
@Query("SELECT * FROM history")
fun getAll() : List<History>
@Insert
fun insertHistory(history: History)
@Query("DELETE FROM history WHERE keyword == :keyword")
fun delete(keyword: String)
}
마지막으로 AppDatabase를 만들어주자.
AppDatabase는 실질적으로 Room을 구현하는 부분이며 RoomDatabase를 상속받는다.
코드의 @Database(...) 부분의 version은 테이블이 추가되거나 변경되면 바꿔주어야 한다.
이 때, 마이그레이션 과정이 필요하다.
그 마이그레이션 함수가 밑에 위치한 Migration(1,2) 이다. version1 -> version2
AppDatabase에 추상 클래스로 historyDao와 reviewDao를 명시함으로써
각각의 Dao에 접근할 수 있도록 했다.
마지막으로 Builder를 통해 실질적으로 RoomDatabase를 만들어 주었다.
@Database(entities = [History::class, Review::class], version = 2)
abstract class AppDatabase: RoomDatabase() {
abstract fun historyDao(): HistoryDao
abstract fun reviewDao() : ReviewDao
}
val migration_1_2 = object : Migration(1,2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE 'REVIEW' ('id' INTEGER, 'review' TEXT," + "PRIMARY KEY('id'))")
}
}
fun getAppDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(
context, AppDatabase::class.java, "BookSearchDB"
)
.addMigrations(migration_1_2)
.build()
}
이렇게 만든 Local DB를 액티비티에서 실제로 사용해보자.
private lateinit var db: AppDatabase
db = getAppDatabase(this)
db.historyDao().getAll()
이렇게 함으로써 위에서 만들어놓은 AppDatabase와
각각의 Dao, Entity에 접근하여 원하는 DB를 얻을 수 있게 된다.
Local DB를 이용하면
서버를 이용하지 않고 자체적으로 DB를 생성하기 때문에
서버 의존도와, 서버의 용량을 줄일 수 있어 작은 프로젝트에 효율적으로 사용할 수 있다.