17. 안드로이드 Room
안드로이드 room 은 Android Jetpack 에 포함된 라이브러리로 내장된 SQLite 보다 더 높은 효율을 내며 사용상에도 편리함이 존재해 사용이 권장된다. 특히 SQLite를 직접 사용하는 것과는 다르게 컴파일 타임에 오류를 확인할 수 있다는 점이 편리함으로 뽑히기도 한다.
room 은 쉽게 말해서 어플, 로컬 내에 특정 데이터를 저장할 수 있는 공간으로 실제로 나는 개발하면서 "자동 로그인 설정 여부", "이용자의 refresh token" 등 어플을 사용하면서 계속 꺼내 써야하는 정보를 저장하는데 사용했다.
room 은 세가지 핵심 구성 요소로 이루어져 있다..
먼저 데이터베이스 클래스는 기본 액세스 포인트 역할을 한다. 데이터 베이스를 보유할 클래스를 정의하는 것으로, 연결된 데이터 항목을 나열하는 배열이 포함되어야 한다.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
위의 예시 코드처럼 @Database 주석이 달려 있어야 하며, RoomDatabase( ) 를 확장하는 추상 클래스여야 한다.
두번째로 데이터 항목이 있다. 데이터 항목은 어플 db의 테이블을 나타낸다. 데이터 항목을 정의하는 부분으로 db에 어떤 요소가 있는지, 요소들의 타입이 무엇인지 등을 확인할 수 있다.
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
마지막으로 데이터 액세스 객체 DAO 가 있다. 앱이 데이터베이스의 데이터를 쿼리, 업데이트, 삽입, 삭제하는데 사용할 수 있는 메서드를 제공한다.
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
다음과 같이 구성요소를 모두 구현하고 난후에 실제로 사용하는 경우에는 아래와 같이 인스턴스를 만들어 room db 를 사용할 수 있다.
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
나는 처음부터 room 을 사용해서 SQLite 와의 차이를 정확하게 체감해보지 못했지만 내부에 데이터를 쿼리하고 저장하는 등의 작업에 room 이 아주 많은 도움이 된다.개발하고 있는 프로젝트에서 room db 마이그레이션이 필요한 부분이 있는데 마이그레이션은 고려해야할 사항들이 많다고 여겨져서 조금 더 공부하고 해볼 예정이다. 정리가 된다면 게시글로 작성해보겠다.