전에 포스팅했던 글에서 SQLite에 대해서 다뤄보았다.
SQLite 게시물 바로가기 ->
Room은 SQLite를 완벽히 활용하면서 원활한 데이터베이스 엑세스가 가능하도록 하는 업그레이드 버전이라 할 수 있다.
여러 장점이 있지만 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 것이 Room의 장점이다.
이러한 이유로 JetPack 라이브러리에 포함된 Room의 사용을 권장하고 있다!
Room 구성요소
데이터베이스
- 데이터베이스는 앱에 저장되어 있는 로컬 데이터에 대한 엑세스 포인트를 제공해주는 역할을 한다.
DAO
- DAO는 앱에서 데이터베이스의 데이터를 추가, 삭제, 업데이트 작업을 할 수 있는 메소드를 제공해주는 역할을 한다.
Entitiy
- 데이터베이스 내에 존재하는 테이블을 가리킨다.
백엔드 개발을 할 당시에 데이터베이스 설계부터 구현까지 직접 해본 경험이 있어, 조금 더 친숙하게 다가오는 것 같다!
그럼 이제 Room을 직접 사용해보자!
먼저 tableName과, 각각의 컬럼들이 정의되어있는 테이블, 즉 Entity 데이터클래스를 만들어주자.
@Entity(tableName = "text_table")
data class TextEntity (
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id : Int,
@ColumnInfo(name = "text")
var text : String
)
그 다음, 이 엔티티를 담고 있는 데이터베이스 클래스를 생성해주어, 데이터베이스 인스턴스를 생성해준다!!
@Database(entities = [TextEntity::class], version = 1)
abstract class TextDatabase : RoomDatabase() {
abstract fun textDao() : TextDao
companion object {
@Volatile
private var INSTANCE : TextDatabase? = null
fun getDatabase(
context : Context
) : TextDatabase {
return INSTANCE ?: synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
TextDatabase::class.java,
"text_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
마지막으로!! 실제로 데이터베이스에 접근하는 DAO를 만들어주어 간단한 쿼리까지 만들어보자!
@Dao
interface TextDao {
@Query("SELECT * FROM text_table")
fun getAllData() : List<TextEntity>
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(text : TextEntity)
@Query("DELETE FROM text_table")
fun deleteAllData()
}
간단하게 데이터를 모두 조회, 삭제 할 수 있는 SELECT, DELETE문을 만들어주고,
데이터를 삽입하기 위한 Insert문 까지 만들어주었다!!
이제 이를 모두 확인하기 위해 다음과 같이 MainActivity에 구현하였다.
insertBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
db.textDao().insert(TextEntity(0, inputArea.text.toString()))
inputArea.setText("")
}
}
getAllBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
Log.d("MAINACTIVITY", db.textDao().getAllData().toString())
}
}
deleteBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
db.textDao().deleteAllData()
}
}
위와 같이 잘 작동되는 것을 확인할 수 있다!!
다음 글에서는 Room을 다른 것들과 어떻게 활용할 수 있는지 공부해봐야겠다.
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] ROOM(3) (0) | 2022.09.05 |
---|---|
[JETPACK개론] ROOM(2) (0) | 2022.09.03 |
[JETPACK개론] SQLite(2) (0) | 2022.08.30 |
[JETPACK개론] SQLite(1) (0) | 2022.08.29 |
[JETPACK개론] Retrofit + ViewModelScope + RV + Glide (0) | 2022.08.28 |