반응형

오늘은 안드로이드의 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를 생성하기 때문에

서버 의존도와, 서버의 용량을 줄일 수 있어 작은 프로젝트에 효율적으로 사용할 수 있다.

 

반응형

+ Recent posts