[AAC] Room

dwjeong·2023년 10월 30일
0

안드로이드

목록 보기
8/28

🔎 Room

Room 라이브러리는 SQLite 위에 추상화 계층을 제공하여 SQLite의 모든 기능을 활용하면서도 데이터베이스 액세스를 원활하게 할 수 있음. (로컬 데이터베이스)

📕 장점

1. SQL 쿼리의 컴파일 시 확인
2. 반복적이고 오류가 발생하기 쉬운 보일러플레이트 코드를 최소화하는 편리한 주석
3. 간소화된 데이터베이스 마이그레이션 경로



🔎 Room의 구성 요소

  1. 데이터 베이스 클래스
    데이터베이스를 보유하고 앱의 영구 데이터에 대한 기본 연결 지점 역할을 하는 클래스.

  2. 데이터 엔티티
    앱의 데이터베이스 내 테이블을 나타내는 엔티티.

  3. 데이터 액세스 객체(DAO)
    앱이 데이터베이스에서 데이터를 쿼리, 업데이트, 삽입 및 삭제할 수 있는 메서드를 제공하는 객체.


데이터베이스 클래스가 해당 데이터베이스와 관련된 DAO 인스턴스를 앱에 제공함.
= 앱이 DAO를 사용하여 데이터베이스에서 관련 데이터 엔티티 객체의 인스턴스로 데이터를 검색할 수 있음.

앱이 정의된 데이터 엔티티를 사용하여 해당 테이블의 행을 업데이트하거나 삽입할 수 있음.



📕 구현

  1. Data entity
    User 데이터 엔티티 구현.
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

  1. Data access object(DAO)
    UserDao 구현. UserDao는 앱의 나머지 부분이 사용자 테이블의 데이터와 상호 작용하는데 사용하는 메서드 제공.
@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>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

  1. Database
    데이터베이스를 보유하기 위한 AppDatabase 클래스 정의.
    AppDatabase는 데이터베이스 구성을 정의하고 영구 데이터에 대한 앱의 주요 액세스 지점 역할을 함.

    📖 데이터베이스 클래스가 충족해야하는 조건
    (1) 클래스는 데이터베이스와 관련된 모든 데이터 엔티티를 나열하는 entities 배열을 포함하는 @Database 어노테이션으로 처리되어야 함.

    (2) 클래스는 RoomDatabase를 확장하는 추상 클래스여야 함.

    (3) 데이터베이스와 관련된 각 DAO 클래스에 대해 데이터베이스 클래스는 DAO 클래스의 인스턴스를 반환하는 인자가 없는 추상 메서드를 정의해야 함.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

4. 사용
val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()

그리고 AppDatabase의 추상메서드를 사용하여 DAO의 인스턴스를 가져올 수 있음.

val userDao = db.userDao()
val users: List<User> = userDao.getAll()

0개의 댓글