✏️ Room Database란
- 안드로이드 앱에서 로컬 DB를 사용해야 할 때 이전에는 SQLite를 사용했다.
- Room은 AAC(Android Architecture Components)의 하나로 지금은 안드로이드 앱의 DB 사용을 Room으로 권고하고 있다.
- Room은 코드 작성을 편하게 하기 위해 SQLite를 추상화한 라이브러리로 내부적으로는 SQLite 이용하고 있어 함수에 정보만 주면 쉽게 로컬 DB를 사용할 수 있다.
✏️ Room Database 사용 방법
1. dependency 설정
plugins {
...
id 'kotlin-kapt'
}
...
dependencies {
def room_version = "최신 버전"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
...
}
2. Database Entity 생성
- 데이터베이스에서 Entity는 개념 스키마를 뜻하며, 테이블이라고 생각하면 된다.
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class User (
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var name: String = "",
var age: String = ""
)
- 기본키에는 @PrimaryKey 어노테이션을 붙인다.
- 기본키를 고유 ID 값으로 지정해 데이터가 생성될 때마다 자동으로 고유 ID 값이 1씩 증가하면서 생성될 수 있도록 (autoGenerate=true)로 지정한다.
- 코틀린에서는 data class를 사용하여 getter/setter를 따로 구현할 필요가 없다.
3. DAO(Data Access Object) 생성
- 데이터베이스에 접근하는 메소드(삽입, 삭제, 수정 등)로 구성된 DAO(Data Access Object) 인터페이스 생성한다.
import androidx.room.*
@Dao
interface UserDao {
@Insert
fun setInsertUser(user: User)
@Update
fun setUpdateUser(user: User)
@Delete
fun setDeleteUser(user: User)
@Query("SELECT * FROM User")
fun getUserAll(): List<User>
}
- @Insert, @Update, @Delete 어노테이션은 각각 삽입, 수정, 삭제로 쿼리를 작성하지 않고 간편하게 데이터를 처리할 수 있다. 이 때 함수의 매개변수는 위에서 정의한 Entity를 사용해야 한다.
- 데이터베이스 조회(Select)나 복잡한 쿼리를 사용해야 할 때는 @Query 어노테이션을 사용해 직접 쿼리를 작성한다.
4. Database 생성
- RoomDatabase를 상속 받은 UserDatabase를 생성한다.
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
- @Database 어노테이션은 데이터베이스와 연결되는 entity와 데이터베이스 항목이 변하는 경우 바꿔줘야 하는 버전을 작성한다.
- 이 때 데이터베이스는 추상 클래스로 작성해야 하며 반환값이 DAO인 매개 변수가 없는 추상 메서드를 포함해야 한다.
5. 코드에서 사용하기
1) DB 객체 생성
val database = Room.databaseBuilder(
applicationContext,
UserDatabase::class.java,
"minha_db"
).fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
mUserDao = database.userDao()
- Room.databaseBuilder의 매개변수
- Context : 보통 applicationContext
- Class : @Database로 어노테이션된 추상 클래스
- name : 데이터베이스 파일 이름(개발자 지정)
- fallbackToDestructiveMigration() : 스키마(Database) 버전 변경 가능
- allowMainThreadQueries() : Main Thread에서 DB에 입출력을 가능하게 함
2) DB 사용
val user1 = User()
user1.name = "minha"
user1.age = "25"
mUserDao.setInsertUser(user1)
val user2 = User()
user2.id = 1
user2.name = "gildong"
user2.age = "33"
mUserDao.setUpdateUser(user2)
val user3 = User()
user3.id = 2
mUserDao.setDeleteUser(user3)
val userList = mUserDao.getUserAll()
for(user in userList) {
binding.tvResult.append("name : ${user.name}, age : ${user.age}\n")
}
✏️ 결과물