-
[Android] Room 사용법안드로이드 2022. 3. 16. 20:43728x90반응형
Room이란?
스마트폰 내장 DB에 상당한 양의 구조화된 데이터를 저장하기 위해 사용하는 라이브러리입니다.
ORM(Object Relational Mapping) 라이브러리로서 DB 데이터를 Java 또는 Kotlin 객체로 매핑해줍니다.
Room은 SQLite를 내부적으로 사용하지만, DB를 구조적으로 분리하여 데이터 접근의 편의성을 높여주고 유지보수에 편리합니다.
또한, 다양한 Annotation을 통해 컴파일 시 코드들을 자동으로 만들어주며 LiveData, RxJava와 같은 Observation 형태를 지원하고 MVP, MVVM과 같은 아키텍처 패턴에 쉽게 활용할 수 있도록 되어 있습니다.
SQLite 대신 Room을 사용하는 이유‼️
- 위에 나오는 안드로이드 문서에서처럼 SQLite는 쿼리의 컴파일 시간 검증을 할 수 없습니다. 반면에 Room 라이브러리 같은 경우 컴파일 타임에 SQL 유효성 검사가 있습니다.
- SQL 쿼리와 Java 혹은 Kotlin 데이터 간에 변환하려면 많은 상용구 코드를 사용해야 합니다. 반면에 Room라이브러리는 상용구 코드 없이 데이터베이스 데이터를 Java 또는 Kotlin 객체에 매핑할 수 있습니다.
정리하자면 Room을 사용 시 다음과 같은 장점이 있습니다.
- SQL 쿼리의 컴파일 시간 확인
- 반복적이고 오류가 발생하기 쉬운 사용구 코드를 최소화하는 편의 Annotation
- 간소화된 데이터베이스 이전 경로
Room 구성요소👨👨👧
Room에는 3가지 구성요소로 이루어져 있습니다.
- Data Entity : 앱 데이터 베이스의 테이블을 나타냅니다.
- Data Access Objects (DAO) : 앱이 데이터베이스의 데이터를 쿼리, 업데이트, 삽입 삭제하는 데 사용할 수 있는 메서드를 제공합니다.
- Database Class : 데이터베이스를 보유하고 앱의 영구 데이터와의 기본 연결을 위한 기본 액세스 포인트 역할을 합니다.
Entity
: DB 내의 Table, 즉 DB에 저장할 데이터 형식으로 class의 변수들이 칼럼으로 구성되어 Table이 됩니다.
Annotation
@Entity (tableName = StudentEntity.TABLE_NAME) : Table 이름을 선언하는 Annotation입니다. (기본적으로 entity class 이름을 database table 이름으로 인식합니다.)
@PrimaryKey : 각 Entity는 최소 1개의 Primary Key를 가여야 합니다.
@ColumnInfo : Table 내 Column을 변수와 매핑시켜주는 Annotation입니다.
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? )
Data Access Object(DAO)
: 데이터베이스에 접근하여 수행할 작업을 메서드 형태로 정의(SQL 쿼리 지정 가능)
Annotation
@Insert : @Entity로 정의된 class만 인자로 받거나, 그 class의 collection 또는 array만 인자로 받을 수 있습니다. 인자가 하나인 경우 long type의 return (insert 된 row ID)을 받을 수 있고, 여러 개인 경우 long [], List를 받을 수 있습니다.
@update : @Entity Table의 데이터 수정. Return 값으로 업데이트된 행 수를 받을 수 있습니다.
@delete : @Entity Table의 데이터 삭제. Return 값으로 삭제된 행 수를 받을 수 있습니다.
@query : @Entity Table의 데이터 조회. Comple time에 return 되는 object의 field와 sql 결과로 나오는 column의 이름이 맞는지 확인하여 일부가 match 되면 warning, match 되는 게 없다면 error를 보낸다.
@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) }
AppDataBase
: 데이터베이스의 전체적인 소유자 역할, DB 생성 및 버전 관리를 하는 역할을 합니다.
데이터베이스 클래스는 다음 조건들을 충족해야 합니다.
- 클래스에는 데이터베이스와 연결된 데이터 항목을 모두 나열하는 Entities 배열이 포함된 @Database 주석이 달려야 합니다.
- 클래스는 RoomDatabase를 확장하는 추상 클래스여야 합니다.
- 데이터베이스와 연결된 각 DAO 클래스에서 데이터베이스 클래스는 인수가 0개이고 DAO클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 합니다.
Annotation
@Database : 클래스가 Database임을 알려주는 어노테이션입니다.
- entities : 이 DB에 어떤 Entity가 있는지 명시
- version : Scheme가 바뀔 때 이 version도 바뀌어야 합니다.
- exprotScheme : Room의 Scheme 구조를 폴더로 Export 할 수 있습니다. Database의 버전 히스토리를 기록할 수 있습니다.
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
앱이 단일 프로세스에서 실행되면 AppDatabase 객체를 인스턴스 화할 때 싱글톤 디자인 패턴을 따라야 합니다. 각
RoomDatabase 인스턴스는 리소스를 상당히 많이 소비하며 단일 프로세스 내에서 여러 인스턴스에 액세스해야 하는 경우는 거의 없습니다.Room 사용법🔥
1. Gradle
plugins { id 'kotlin-kapt' } ... dependencies { ... def room_version = "2.4.2" // Room components implementation("androidx.room:room-runtime:$roomVersion") implementation("androidx.room:room-ktx:2.4.0") annotationProcessor("androidx.room:room-compiler:$roomVersion") //annotationProcessor to kapt kapt("androidx.room:room-compiler:2.4.0") ... }
코틀린 기준의 앱 수준의 build.gradle 파일에 위와 같은 종속 항목을 추가합니다.
2. 데이터베이스 인스턴스 생성
object DatabaseProvider { //DB명 private const val DB_NAME = "RoomExample" //RoomDatabase 인스턴스에 접근하는 함수 fun getAppDatabase(context: Context): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME).build() }
공식 문서에서 설명한 것과 같이 데이터베이스 객체를 인스턴스화 할 때 비용을 아끼면서 데이터의 일치성을 보존하기 위해 싱글톤으로 구현하여 사용합니다.
3. 데이터베이스 데이터 가져오기
val users = DatabaseProvider.getAppDatabase(context).UserDao().getAll()
appDatabase의 인스턴스를 통해 DAO인스턴스를 가져올 수 있습니다. 결과적으로 DAO인스턴스의 메서드를 사용하여 데이터베이스와 상호작용 할 수 있습니다.
출처👍🏻
https://velog.io/@ryalya/Android-DB-Room이란#1-gradle-설정
https://developer.android.com/training/data-storage/room?hl=ko#setup반응형728x90반응형'안드로이드' 카테고리의 다른 글
[Android] Fragment에서 Google Map Api 사용하기 (0) 2022.03.18 [Android] SharedPreferences (0) 2022.03.17 [Android] ItemTouchHelper란 (0) 2022.03.11 [Android] Retrofit 쉼표로 구분된 값을 하나의 파라미터로 전송해야 할 때 (ID =1,2,3,4,5) (0) 2022.03.10 [Android] 안드로이드 View 성능 올리는 꿀팁 feat.Naver Tech Concert 2020 (0) 2022.03.08