Android-Kotlin📱

[Android] Room (Entitiy, DAO, Database)

주로티 2022. 7. 9. 21:55

 

Room 라이브러리 아키텍처 다이어그램

 

 

SQLite는 스토리지 및 쿼리 기능을 제공하는 기본 데이터베이스 엔진인 반면

Room은 편리한 API, 컴파일 시간 검사 및 SQL 쿼리 생성을 제공하는 Android AAC Android Jetpack의 구성요소

 

SQLite 데이터베이스 작업을 간소화하는 추상화 라이브러리

 

Room의 장점

 

1. 단순화된 데이터베이스 작업

 

Room은 Android 애플리케이션에서 데이터베이스 작업에 대한 편안함을 제공합니다.

원시 SQL 쿼리를 수동으로 작성할 필요가 없고

→ 데이터 삽입, 업데이트 및 쿼리와 같은 일반적인 데이터베이스 작업이 가능하기 때문

 

상용구 코드를 줄이고 DB 작업을 보다 간단하고 효율적으로 만듭니다.

 


2. 컴파일 시간 검사 및 유형 안전성

 

Room은 SQL 쿼리에 대한 컴파일 시간 확인이 가능하여 구문 오류 및 오타가 개발 중에 조기에 발견되도록 합니다.

컴파일 타임에 열 유형의 유효성을 검사하여 유형 안전성을 제공합니다.

→ 런타임 오류를 방지하여 안정적인 DB 구현이 가능합니다.

 

 

3. 데이터베이스 마이그레이션 및 스키마 관리

 

Room에는 DB 마이그레이션 지원 기능이 내장되어 스키마를 쉽게 수정할 수 있습니다.
데이터 손실이나 수동 개입 없이 데이터베이스 스키마 업데이트를 처리하는 메커니즘을 제공합니다.
버전이 업데이트될 때 데이터베이스 스키마를 관리하고 업그레이드하는 프로세스가 간소화됩니다.

 


Room 사용의 이점


단순화된 데이터베이스 작업
컴파일 시간 검사 및 유형 안전성
데이터베이스 마이그레이션 및 스키마 관리

→ 깨끗한 코드, 오류 감소 및 효율성 향상에 기여합니다.

 

 

 

 

Room 구성요소

 

Entity

데이터베이스 내부에 있는 테이블들을 Kotlin 혹은 Java로 데이터 클래스, 클래스로 나타낸 것

 

DAO (Data Access Object)

데이터베이스에서 데이터 삽입, 삭제 및 선택과 같은 다양한 작업을 수행할 수 있도록 하는 메서드를 제공

 

DataBase

구조화된 데이터에 액세스하고 관리하기 위한 기본 허브 역할을 하며 앱에서 중앙 스토리지 시스템 역할

 

 

Entity

@PrimaryKey를 사용하여 각 행을 고유하게 식별하는 기본 키가 존재함.
data class를 사용하면 eqauls(), hashCode() 및 toString() 같은 공통 함수를 자동으로 제공해서 편리할 수 있지만 

인수 없는 생성자를 사용할 수도 있기 때문에 class를 사용
기본 구현에 대한 더 많은 제어를 제공하는 엔터티에 사용

 

 

@Entity(Table name) 
data class (class name) (
    @Column (name = "first_name") val firstName: String?,
    val listName: String?
)


@Entity (tableName = Student)
data class User (
    @ColumnInfo (name = "first_name) val firstName: String?,
    @ColumnInfo val lastName: String?,
    val middleName: Stirng
)

 

테이블 이름이 Entity 클래스의 이름과 일치하는 경우 
@Entity 주석에서 tableName 매개변수를 생략할 수 있습니다.

엔티티 내부에서 주석을 사용하게 되면 테이블 및 열 이름을 사용자 지정할 수 있습니다.
주석을 추가하게 되면 클래스 이름과 일치하지 않더라도 동작한다

@ColumnInfo(name = "first_name")
기존 스키마와 일치해야 하거나 
더 설명적인 이름이 필요한 경우 유용

 

 

DAO (Data Access Object)

@Dao
interface UserDao {
    @Insert
    fun insertUser(user: User)

    @Query("SELECT * FROM User")
    fun getAllUsers(): List<User>

    @Query("SELECT * FROM User WHERE first_name = :firstName")
    fun getUsersByFirstName(firstName: String): List<User>

    @Update
    fun updateUser(user: User)

    @Delete
    fun deleteUser(user: User)

    @Query("DELETE From User")
    fun deleteUser()
}

 

DAO는 'User' 엔터티에서 기본 CRUD(만들기, 읽기, 업데이트, 삭제) 작업을 수행하는 데 필요한 메서드를 제공합니다.

@Insert, @Query, @Update, @Delete은 해당 데이터베이스 작업을 정의하는 데 사용되며

메서드 이름과 매개변수는 각 작업의 기능과 조건을 정의합니다.

 

@Query("DELETE FROM User")는 "User" 테이블에서 모든 행을 삭제하는 직접적인 SQL 문
@Delete는 특정 엔터티 개체를 삭제하는 DAO 메서드를 지정하는 데 사용되는 구문

 

 

 

DataBase

 

// 데이터베이스 클래스 정의
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

// 데이터베이스 인스턴스 생성
val database = Room.databaseBuilder(context, AppDatabase::class.java, "app_database")
    .build()

// UserDao 인스턴스 가져오기
val userDao = database.userDao()

// 데이터베이스 작업 수행
val user = User("John", "Doe", "Smith")
userDao.insertUser(user)

val allUsers = userDao.getAllUsers()
// 모든 사용자 조회
allUsers.forEach { println(it) }

val usersByName = userDao.getUsersByFirstName("John")
// 이름이 'John'인 사용자 조회
usersByName.forEach { println(it) }

user.lastName = "Smithers"
userDao.updateUser(user)

userDao.deleteUser(user)

userDao.deleteAllUsers()

 

 

데이터베이스를 설정하고 데이터베이스 작업을 수행하는 기본적인 구조입니다.

데이터베이스와 상호작용하기 위해 UserDao 인스턴스를 사용하여 삽입, 조회, 업데이트 및 삭제할 수 있습니다.