[androidx] Room

sundays·2022년 12월 2일
0

android

목록 보기
5/18

이번에 혼자 플젝을 하면서 Room을 도입하였습니다. 제가 참고한 프로젝트는 android에서 제공하는 sunflower 입니다. 원래는 realm을 도입하려고 했는데 다른 회사 구인 구직을 보다가 보니 room을 이용하는 곳들이 많은 듯 해서 이쪽을 우선으로 보게 되었습니다. 이전에 저는 SQLite를 사용하여 직접 데이터를 저장하는 방식으로 진행하였습니다. 쿼리를 직접 String으로 쓴 후에 데이터를 재조합 하여야 하는 등 후 작업이 많았는데요. ROOM은 그런 번거로운 과정을 줄이기 위해 다음과 같은 제공하고 있습니다

  • SQL 오류시 컴파일 에러로 에러를 발견하기 쉬움
  • 반복적이고 오류가 발생하기 쉬운 상용구를 최소화
  • 데이터 베이스 이전 경로

build.gradle

가장 기본적으로 gradle에 추가하여야 하는 부분은 다음과 같습니다

dependencies {
	implementation("androidx.room:room-ktx:2.4.3")
    kapt("androidx.room:room-compiler:2.4.3")
}

이외에도 optional 로 기능을 추가하여 사용할 수 있기때문에 사이트를 참고하시면
부가 기능을 더 추가하여 사용할 수 있습니다

구성 요소

데이터베이스 클래스

  • 데이터베이스 보유
  • 영구 데이터와의 기본 연결 액세스 포인트
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
  • @Database 주석을 단 entities 배열을 포함해야 합니다
  • RoomDatabase를 확장하는 추상 클래스여야 합니다
  • 단일 프로세스 일시 AppDatabase 객체를 인스턴스화할때 싱글톤 디자인 패턴으로 생성해야 합니다.
  • Room은 리소스를 많이 소비 하여 단일 프로세스 내에서 액세스 해야 하는 경우는 거이 없는데 만약 여러 프로세스에서 실행해야 하는 경우에는 빌더 호출에서enableMultiInstanceInvalidation()를 포함하여 공유 데이터베이스 파일을 무효화 할 수 있으며다른 프로세스내의 appDatabase인스턴스로 자동 전파되게 할 수 있습니다

데이터 항목

  • 데이터 베이스 테이블
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)
  • @Entity주석이 달린 클래스로 정의해야 합니다
  • 기본키(@primarykeys)를 구성하는 하나이상의 필드가 포함되어야합니다.
  • 열 이름을 다르게 하려면 columnInfo 주석을 필드에 추가하고 name속성을 설정 합니다.
  • @Ignore를 사용하여 필드 무시를 할 수 있습니다.

데이터 액세스 객체 (Data Acess Object)

  • Query, Update, Insert, Remove method 제공
@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)
}
  • 편의 메서드 : SQL 작성없이 행을 삽입, 업데이트, 삭제 할 수 있습니다
    • @Insert - 데이터베이스의 매개변수를 삽입하는 메서드를 정의
    • @Update - 특정 행을 업데이트 하는 메서드를 정의
    • @Delete - 특정 행을 삭제하는 메서드를 정의
  • 쿼리 메서드 : SQL 작성하여 데이터에 접근
    • 편의 메서드보다 더 복잡한 삽입, 삭제, 수정을 실행하야 할 경우 사용한다
    • 컴파일 시간에 SQL 쿼리를 검증한다
    • 쿼리에 문제가 있으면 컴파일 오류가 발생한다

USE

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

AppDatabase의 추상 메서드로 DAO를 가져와서 데이터 베이스와 상호 작용 할 수 있습니다.

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

Reference

profile
develop life

0개의 댓글