📕Room이란?
Room 지속성 라이브러리는 SQLite를 완벽히 활용하면서 원활한 데이터베이스 액세스가 가능하도록 SQLite에 추상화 계층을 제공합니다.
📕Room 사용의 이점
- SQL 쿼리의 컴파일 시간 확인
- 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 편의 주석
- 간소화된 데이터베이스 이전 경로
📕Room 사용에 좋은 예시
공식 문서에 있는 바를 간단하게 요약하면, 유저가 앱을 실행하는 환경이 오프라인이었을 경우에는 이전에 온라인 상태에 있을 때 콘텐츠를 Room을 통해 저장해둔 콘텐츠를 불러와서 보여주며 유저와 상호작용을 하다가 이후에 다시 온라인 상태가 되면 유저가 동작한 내용을 서버와 동기화하도록 하여 서버에 반영되도록 설계하면 이득이라고 한다고 한다.
이러한 점을 고려해서 SQLite API를 직접 사용하는 대신 Room을 사용하는 것이 좋다고 합니다.
💻설정
앱에서 Room을 사용하려면 앱의 build.gradle 파일에 다음 종속 항목을 추가합니다.
dependencies {
val room_version = "2.4.3"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
kapt("androidx.room:room-compiler:$room_version")
ksp("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-ktx:$room_version")
implementation("androidx.room:room-rxjava2:$room_version")
implementation("androidx.room:room-rxjava3:$room_version")
implementation("androidx.room:room-guava:$room_version")
testImplementation("androidx.room:room-testing:$room_version")
implementation("androidx.room:room-paging:2.5.0-alpha02")
}
💡기본 구성요소
Room에는 다음 3가지 중요 구성요소가 있습니다.
- 데이터베이스 클래스 : 데이터베이스를 보유하고 앱의 영구 데이터와의 기본 연결을 위한 기본 액세스 포인트 역할을 합니다.
- 데이터베이스 클래스가 충족해야 할 조건
- 클래스에는 데이터베이스와 연결된 데이터 항목을 모두 나열하는 entities 배열이 포함된 @Database 주석이 달려야한다.
- 클래스는 RoomDatabase를 확장하는 추상 클래스여야 한다.
- 데이터베이스와 연결된 각 DAo 클래스에서 데이터베이스 클래스는 인수가 0개이고 DAO 클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 한다.
- 데이터베이스 클래스가 충족해야 할 조건
- 데이터 항목 : 앱 데이터베이스의 테이블을 나타냅니다.
- 데이터 액세스 객체(DAO) : 앱이 데이터베이스의 데이터를 쿼리, 업데이트, 삽입, 삭제하는 데 사용할 수 있는 메서드를 제공합니다.
데이터베이스 클래스는 데이터베이스와 연결된 DAO 인스턴스를 앱에 제공합니다. 그러면 앱은 DAO을 사용하여 데이터베이스의 데이터를 연결된 데이터 항목 개체의 인스턴스로 검색할 수 있게 됩니다.
앱은 정의된 데이터 항목을 사용하여 상응하는 테이블의 행을 업데이트하거나 삽입할 새 행을 만들 수 있습니다.
아래 그림은 다양한 Room 구성요소 간 관계를 보여줍니다
💻데이터 항목
아래 코드는 User 데이터 항목을 정의합니다. 각 User 인스턴스는 앱 데이터베이스의 user 테이블에 있는 행 하나를 나타낸다.
@Entity(tableName = "users")
data class User (
@PrimaryKey val id: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
@PrimaryKey로 주석을 달아서 데이터베이스 테이블의 각 행을 고유하게 식별하는 기본키를 정의한다.
테이블 이름을 다르게 하려면 @Entity 주석의 tableName 속성을 설정해줘야 한다.(기본 값은 클래스의 이름)
열 이름을 다르게 하려면 @ColumInfo 주석을 필드에 추가하고, name 속성을 설정해줘야한다. (기본값은 필드 이름을 사용)
💻데이터 액세스 객체(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 //해당 user만 제거
fun delete(user: User)
}
💻데이터베이스
🔎데이터베이스를 보유할 AppDatabase 클래스 정의하기
해당 AppDatabase 클래스는 위에서 명시되어있는 3가지 조건을 충족해야 한다.
💡[3가지 조건 보러 가기]
데이터베이스 코드를 보면 version을 명시하는 것을 알 수 있는데 이는 우리가 이후 버전에서 데이터베이스(정의 등)를 수정하게 된다면, 해당 버전 코드를 업데이트하고 마이그레이션 하는 등의 작업을 해줄 수 있다고 한다.
즉 처음에 정의한 데이터베이스에서 계속 살을 붙여서 수정할 수 있는 기능 때문에 version을 명시하는 것이다.
//db가 생성될때 User 테이블을 사용한다는것을 명시
//버전작성 -> 업데이트시 수정기능인듯?
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao //AppDatabase가 생성시 UserDao를 가져가서 사용할 수 있게허락함.
}
🔎Database 사용하기
데이터 항목, 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()
🔎참고
앱이 단일 프로세스에서 실행되면 AppDatabase 객체를 인스턴스 화할 때 싱글톤 디자인 패턴을 따라야 합니다. 각 RoomDatabase 인스턴스는 리소스를 상당히 많이 소비하며 단일 프로세스 내에서 여러 인스턴스에 액세스해야 하는 경우는 거의 없습니다.
앱이 여러 프로세스에서 실행되는 경우 데이터베이스 빌더 호출에 enableMultiInstanceInvalidation()을 포함하세요. 이렇게 하면 각 프로세스에 AppDatabase 인스턴스가 있을 때 한 프로세스에서 공유 데이터베이스 파일을 무효화할 수 있으며 이 무효화는 다른 프로세스 내의 AppDatabase 인스턴스로 자동 전파됩니다.
출처
https://whyprogrammer.tistory.com/573
[Android] Room 사용하여 로컬 데이터베이스에 데이터 저장하기
1. 안드로이드 Room 으로 로컬 데이터베이스에 데이터 저장하기 Android 개발자 라이브러리 Room은 SQLite를 추상화 하여 제공하기 때문에 보다 쉬운 데이터 베이스 사용이 가능합니다. 또 물론 SQLite에
whyprogrammer.tistory.com
https://developer.android.com/training/data-storage/room?hl=ko
Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers
Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기
developer.android.com
'Skils > Android' 카테고리의 다른 글
[Android] - Layout이란 (0) | 2022.10.07 |
---|---|
[Android] 애플리케이션 기본항목 - 4대 구성요소(Component) (1) | 2022.09.23 |
[Android] - 계산기 만들기(클론 코딩) - 계산 기록O (0) | 2022.09.18 |
[Android] - 계산기 만들기 (클론 코딩) -계산 기록 x (0) | 2022.09.17 |
[Android Studio] 계산기 어플 앱 만들기(Kotlin) #1 (0) | 2022.08.25 |