[Android] Room

푸른하늘·2022년 9월 11일
0
post-thumbnail

Room

로컬 데이터 베이스로 오프라인 상태에서도 탐색 하도록 데이터를 케시하는 것

Room은 원래 의미는 "방" 이다 . 왜 "Room"이라고 지었을까?
개인적인 의견으로 , 우리는 외부로 위험 및 보호를 하기 위해 자신의 "Room"안에서 지낸다.

이처럼 모바일도 외부로부터의 위험을 보호해야 한다.

  • 네트워크가 끊길경우 작업중인 문서 작업 및 기록이 저장해야 된다.
  • 네트워크가 없는 앱일 경우 사용자 모바일 안에서 저장을 해야한다.

로컬 데이터 베이스는 무엇일까?

외부 통신 없이 DB를 사용하고 싶을때 유용한 것

주로 Room은 상당한 양의 구조화된 데이터를 처리할 때 데이터를 로컬에 유지하면 사용자가 보고 있던 데이터의 작업 및 위치를 알 수 있습니다.

만약 당신이 앱안에서 문서 작업을 하는 도중 앱이 꺼져서 데이터가 다 날라간다면?

  1. 다시 처음부터 작업한다
  2. 로컬 DB에 저장하여 다시 켜서 유지한다.

극단적 예시이지만, 당연히 2번을 선택 할 것이다.
앱을 사용하면서도 꾸준하게 데이터를 계속 저장할 필요가 있습니다.

안드로이드 에서는 저장하는 방법이 여러 가지 방식으로 저장하지만 ,이 글에서는 Room에 대해서만 언급할 것입니다.

Why use Room?

기존 오프라인(네트워크 ❌) 일 경우 Android 에서는 가벼운 관계형 DB인 SQLite를 라이브러리에 포함되어 있었습니다.

하지만❗️ SQLite는 다음과 같은 이유로 Room을 권장하게 되었습니다.

SQL 쿼리에 대해서 올바르게 작성이 되었는지 컴파일 타임에 확인할 수가 있다.

  • 기존 SQLite는 컴파일 타임에 검증읆 못했다 이를 못할시, 잘못된 Query를 사용했을 때 오류를 직접 업데이트를 해야합니다.
  • Room은 컴파일 타임에 유효성 검사를 진행하여 이를 예방할 수 있습니다.

SQL쿼리와 데이터 객체와의 변환이 자유롭지 않습니다.

  • 즉. 사용하기 어렵다는 뜻이다. Room은 이러한 문제들을 자동으로 처리할 수 있도록 도와준다.

Room 구성요소

Room 은 크게 3가지로 구성되어있습니다.

  • 데이터 항목(Entity) : 앱 데이터베이스의 테이블을 나타냅니다.
  • 데이터 엑세스 객체(DAO) : 엡 DB 안의 쿼리 ,CRUD 등 사용할 수 있는 메소드 제공
  • 데이터베이스 클래스(Room DB) : DB를 보유하고 앱의 영구 데이터 및 기본 연결을 위한 엑세스 포인트 역할

데이터 항목 (Entity)

DB 안 테이블의 데이터의 항목을 정의하는 곳입니다.

  • @Entity : 해당 클래스의 테이블 이름을 나타내며 테이블 이름을 바꿀 수도 있다.
  • @PrimaryKey : 테이블 안에 데이터를 구분할 수 있게 하는 기본키다.
  • @ColumnInfo : 테이블 안애 컬럼입니다. 이름 변경이 가능합니다.
  • @Ignore : 테이블의 유지하고 싶은 데이터가 있을 경우 사용합니다.

쇼핑몰 회원가입 예시로 테이블을 만들어보자

  • User라는 Data Class를 만든후 @Entity 를 선언한다
  • @Primarey는 uid 고유값으로 지정
  • @ColumnInfo 는 (first_name)으로 변경해서 저장했다.
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

데이터 엑세스 객체(DAO)

모바일 DB 안에서 CRUD를 하요 상호작용하는 부분이다.

간단히 말하면 데이터를 요리하는 곳이다. 우리가 요리 할 때 원하는 재료를 가져다 사용하며 필요하지 않거나 썩으면 버리게 된다.

이처럼 데이터를 삽입 , 삭제 , 변경 , 할 때 사용된다.

  • @Dao : Room이 인터페이스를 Dao로 식별할 수 있도록 하기 위해서
  • @Insert : 데이터를 삽입할때 사용된다.
  • @Select : 데이터를 선택할 때 사용된다.
  • @Update. : 데이터를 업데이트 할 때 사용된다
  • @Delete : 데이터를 삭제할 때 사용된다.
  • @Query. : 쿼리를 사용하여 원하는 DB를 조회할 수 있다.

쇼핑몰 사용할 것들

  • 전체 사용자 목록을 조회한다.
  • 현재 사용자의 고유 UID (Primary key) 사용하여 데이터 찾기
  • 사용자에 정보에 대해 삽입
  • 사용자 정보 삭제
@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)
}

데이터베이스 클래스(Room DB)

DB를 보유할 AppDatabase클래스 정의 하는 곳

사용자가 생성한 Entity(table)들을 가져와서 구성을 정의한다.

  • entities: [table name::class] 가 들어간다
  • version : 사용자가 사용하는 버전관리를 위해 사용된다.
  • 추상메소드 정의 : (Dao Class Name) 를 가져와서 추상 메소드를 정의한다.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
   abstract fun userDao(): UserDao
}

데이터베이스 사용(Room DB)

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

0개의 댓글