[개념] 안드로이드 Room 이란?

쓰리원·2022년 6월 5일
0

Room

목록 보기
1/1
post-thumbnail

1. Room 이란?

Room은 Jetpack에서 AAC(Android Architecture Components)로 제공하는 데이터베이스 라이브러리 입니다. SQLite에 대한 추상화 레이어를 지원하여, 로컬 DB를 쉽고 강력하게 제어할 수 있도록 도와줍니다. 아래의 그림의 Model에 Room이 있는 것을 확인할 수 있습니다.

2. Room 구성요소

Room에는 다음 3가지 주요 구성요소가 있습니다.

  • 데이터베이스 클래스 : 데이터베이스를 보유하고 앱의 영구 데이터와의 기본 연결을 위한 기본 액세스 포인트 역할을 합니다.
  • 데이터 항목 : 앱 데이터베이스의 테이블을 나타냅니다.
  • 데이터 액세스 객체(DAO) : Database Access Object의 약자로 앱이 데이터베이스의 데이터를 쿼리, 업데이트, 삽입, 삭제하는 데 사용할 수 있는 메서드를 제공하는 Interface입니다.

위 그림을 보면 1. Room Database에는 Get DAO가 적혀있는 것을 확인할 수 있습니다. 이를 통해서 데이터베이스 클래스는 데이터베이스와 연결된 DAO 인스턴스를 앱에 제공하는 것을 알 수 있습니다.

그러면 앱은 2. DAO를 사용하여 데이터베이스의 데이터를 연결된 데이터 항목 객체의 인스턴스로 검색할 수 있게 됩니다. 앱은 정의된 데이터 항목을 사용하여 상응하는 테이블의 행을 업데이트하거나 삽입할 새 행을 만들 수도 있습니다. 즉, 데이터 베이스를 사용하는 메서드를 호출해서 여러가지 원하는 조작을 한다고 보면 될 것 같습니다. 위의 영어 설명처럼 persist change back to db(= 변경 사항을 DB로 다시 유지 시키는 것) 입니다.

마지막으로 3. Entities 경우는 실질적으로 데이터를 넣는 그릇이라고 보면 됩니다. 항목에 원하는 최종 데이터를 넣어서 그릇에 맞게 보관을 할 수있게 되는 것 입니다.

3. Room 적용

1. Data entity

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

2. 데이터 액세스 객체(DAO)

다음 코드는 UserDao라는 DAO를 정의합니다. UserDao는 앱의 나머지 부분이 user 테이블의 데이터와 상호작용하는 데 사용하는 메서드를 제공합니다.

@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)
}

어노테이션에는 네 가지 종류가 있습니다.

@Insert : 데이터 삽입
@Delete : 데이터 삭제
@Update : 데이터 수정
@Query : SQL문을 적어서 사용 방법을 정의

위의 어노테이션들을 기능에 맞게 사용하면 됩니다.

3. 데이터베이스

다음 코드는 데이터베이스를 보유할 AppDatabase 클래스를 정의합니다. AppDatabase는 데이터베이스 구성을 정의하고 영구 데이터에 대한 앱의 기본 액세스 포인트 역할을 합니다. 데이터베이스 클래스는 다음 조건을 충족해야 합니다.

  • 클래스에는 데이터베이스와 연결된 데이터 항목을 모두 나열하는 entities 배열이 포함된 @Database 주석이 달려야 합니다.

  • 클래스는 RoomDatabase를 확장하는 추상 클래스여야 합니다.

  • 데이터베이스와 연결된 각 DAO 클래스에서 데이터베이스 클래스는 인수가 0개이고 DAO 클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 합니다.

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

4. Usage

데이터 항목과 DAO, 데이터베이스 객체를 정의한 후에는 다음 코드를 사용하여 데이터베이스 인스턴스를 만들 수 있습니다.

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

그런 다음 AppDatabase의 추상 메서드를 사용하여 DAO 인스턴스를 가져올 수 있습니다. 결과적으로 DAO 인스턴스의 메서드를 사용하여 데이터베이스와 상호작용할 수 있습니다.

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

4. reference

https://developer.android.com/training/data-storage/room?hl=ko
https://math-coding.tistory.com/247
https://genius-dev.tistory.com/entry/Android-Room%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%A1%9C%EC%BB%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0?category=978660

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글