로컬 데이터 베이스로 오프라인 상태에서도 탐색 하도록 데이터를 케시하는 것
Room은 원래 의미는 "방" 이다 . 왜 "Room"이라고 지었을까?
개인적인 의견으로 , 우리는 외부로 위험 및 보호를 하기 위해 자신의 "Room"안에서 지낸다.
이처럼 모바일도 외부로부터의 위험을 보호해야 한다.
외부 통신 없이 DB를 사용하고 싶을때 유용한 것
주로 Room은 상당한 양의 구조화된 데이터를 처리할 때 데이터를 로컬에 유지하면 사용자가 보고 있던 데이터의 작업 및 위치를 알 수 있습니다.
만약 당신이 앱안에서 문서 작업을 하는 도중 앱이 꺼져서 데이터가 다 날라간다면?
극단적 예시이지만, 당연히 2번을 선택 할 것이다.
앱을 사용하면서도 꾸준하게 데이터를 계속 저장할 필요가 있습니다.
안드로이드 에서는 저장하는 방법이 여러 가지 방식으로 저장하지만 ,이 글에서는 Room에 대해서만 언급할 것입니다.
기존 오프라인(네트워크 ❌) 일 경우 Android 에서는 가벼운 관계형 DB인 SQLite를 라이브러리에 포함되어 있었습니다.
하지만❗️ SQLite는 다음과 같은 이유로 Room을 권장하게 되었습니다.
SQL 쿼리에 대해서 올바르게 작성이 되었는지 컴파일 타임에 확인할 수가 있다.
SQL쿼리와 데이터 객체와의 변환이 자유롭지 않습니다.
Room 은 크게 3가지로 구성되어있습니다.
DB 안 테이블의 데이터의 항목을 정의하는 곳입니다.
쇼핑몰 회원가입 예시로 테이블을 만들어보자
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
모바일 DB 안에서 CRUD를 하요 상호작용하는 부분이다.
간단히 말하면 데이터를 요리하는 곳이다. 우리가 요리 할 때 원하는 재료를 가져다 사용하며 필요하지 않거나 썩으면 버리게 된다.
이처럼 데이터를 삽입 , 삭제 , 변경 , 할 때 사용된다.
쇼핑몰 사용할 것들
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
DB를 보유할 AppDatabase클래스 정의 하는 곳
사용자가 생성한 Entity(table)들을 가져와서 구성을 정의한다.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()