
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 인스턴스를 사용하여 삽입, 조회, 업데이트 및 삭제할 수 있습니다.
'Android-Kotlin📱' 카테고리의 다른 글
팀 프로젝트 규칙 (0) | 2023.12.11 |
---|---|
Fragment Lifecycle Callback (0) | 2023.12.03 |
[안드로이드] 액티비티 라이프 사이클 Activity Life Cycle (0) | 2022.06.29 |
[Android] 안드로이드 4대 컴포넌트 (Activity, Service, BroadCast Receiver, Content Provider) (0) | 2022.06.19 |
[Android] Constraint Layout Guideline (컨스트레인트 레이아웃 가이드라인) (0) | 2022.06.07 |