Room
룸은 재트팩 아키텍쳐 컴포넌트 라이브러리 이다.
데이터베이스 설정과 사용을 쉽게 해준다.
룸을 사용하면 애노테이션이 지정된 코틀린 클래스로 데이터베이스 구조와 쿼리를 정의할 수 있다.
룸의 구성은?
- API : 데이터베이스를 정의하고 인스턴스를 생성하기 위해 상속받는 클래스들이 API에 포함되어 있다.
- Annotation (@) : 데이터베이스에 저장할 필요가 있는 클래스, 데이터베이스를 나타내는 클래스, 데이터베이스 테이블을 사용하는 함수들을 정의하는 클래스 등을 나타내기 위해 애노테이션을 사용한다.
- Compiler : 지정한 애노테이션을 컴파일해서 데이터베이스 구현체를 생성한다.
종속성 추가
...
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
...
android{...}
dependencies{
...
implemenation 'androidx.room.room:room-runtime:version
kapt 'androidx.room:room-compiler:version
...
}
룸으로 DB 생성
룸으로 DB 를 생성할 때는 다음 세 단계가 필요하다. 테이블을 만들고, 데이터베이스를 지정해주고, 형 변환기를 만들어준다.
- 모델 클래스에 애노테이션을 지정해 데이터베이스 엔터티를 만든다. -- Entity
package com.ㅌ.android.ㅌ import androidx.room.Entity import androidx.room.PrimaryKey import java.util.* @Entity data class Crime(@PrimaryKey val id: UUID = UUID.randomUUID(), var title : String = "", var date : Date = Date(), var isSolved: Boolean = false)
- 데이터베이스 자체를 나타내는 클래스를 생성한다. -- Database
package com.bignerdranch.android.criminalintent.database import androidx.room.Database import androidx.room.RoomDatabase import com.bignerdranch.android.criminalintent.Crime /*이 클래스가 앱의 데이터베이스를 나타낸다고 Room에게 알려준다. * 관리하는 앤터티 Crime같은 것을 나열해서 받아오고, 처음 생성 * 할때는 버전이 1이다. 새로운 엔터티를 추가하거나 기존 엔터티 * 에 새로운 속성을 추가할 수 있다. 이때, 버전번호를 바꿔주거나 * 엔터티들을 변경해주면 된다. * */ @Database(entities = [Crime::class], version = 1) abstract class CrimeDatabase : RoomDatabase(){ }
- 데이터베이스가 모델 데이터를 처리할 수 있게 타입 변환기를 생성한다. -- Converter
룸은 내부적으로 SQLite 를 사용한다. ( SQL Structured Query Language 표준 데이터베이스 언어)
안드로이드는 추가 도우미 클래스들과 함께 SQLite 라이브러리를 표준 라이브러리에 포함하고 있다.
룸은 코틀린 객체와 데이터베이스 사이에서 객체 - 관계 매핑 계층의 역할을 하면서 SQLite 사용을 쉽게 한다.
룸을 사용하면 대부분의 경우에 SQLite를 자세히 알 필요가 없어진다.
룸은 컨버터가 필요하다. 룸은 기본 데이터 타입을 SQLite DB 테이블에 쉽게 저장할 수 있다.
그러나, 이외의 다른 타입은 문제가 생길 수 있다. 따라서 이러한 타입의 데이터를 데이터베이스 테이블에 저장하거나 가져오는 방법을 룸에게 알려줘야 한다. 타입 변환기 Converter 를 지정하여 따로 형 변환을 해주면 된다.
@TypeConverter 애노테이션을 활용하여 함수를 생성해주고 사용하면 된다.
주로 따로 Converter class를 생성하여 사용한다.
이렇게 생성한 컨버터를 DB를 생성한 추상 클래스 위에 올려준다.package com.xxxx.android.xxxx.database import androidx.room.TypeConverter import java.util.* class CrimeTypeConverters { @TypeConverter fun fromDate(date: Date?): Long?{ return date?.time } @TypeConverter fun toDate (millisSinceEpoch : Long?) :Date?{ return millisSinceEpoch?.let { Date(it) } } @TypeConverter fun toUUID(uuid: String?) : UUID? { return UUID.fromString(uuid) } @TypeConverter fun fromUUID(uuid:UUID?): String?{ return uuid?.toString() } }
@TypeConverters(컨버터 클래스::class) 를 사용해준다.
package com.ㅌㅌㅌ.android.ㅌㅌㅌ.database import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters import com.bignerdranch.android.criminalintent.Crime /*이 클래스가 앱의 데이터베이스를 나타낸다고 Room에게 알려준다. * 관리하는 앤터티 Crime같은 것을 나열해서 받아오고, 처음 생성 * 할때는 버전이 1이다. 새로운 엔터티를 추가하거나 기존 엔터티 * 에 새로운 속성을 추가할 수 있다. 이때, 버전번호를 바꿔주거나 * 엔터티들을 변경해주면 된다. * */ @Database(entities = [Crime::class], version = 1) @TypeConverters(CrimeTypeConverters::class) abstract class CrimeDatabase : RoomDatabase()
DAO 만들기
DAO (Data Access Object) 데이터베이스에 접근하는 인터페이스이다.
이 객체는 DB작업을 수행하는 함수들을 포함하고 있다. 즉, 쿼리를 가지고 있는 클래스이다.
package com.bignerdranch.android.criminalintent.database
import androidx.room.Dao
import androidx.room.Query
import com.bignerdranch.android.criminalintent.Crime
import java.util.*
@Dao
interface CrimeDao {
@Query("SELECT * FROM crime")
fun getCrimes(): List<Crime>
@Query("SELECT * FROM crime WHERE id =(:id)")
fun getCrime(id: UUID) : Crime?
}
DAO 클래스를 만들었다면, 이제 DB 클래스에 등록해줘야 사용이 가능하다.
@Database(entities = [Crime::class], version = 1)
@TypeConverters(CrimeTypeConverters::class)
abstract class CrimeDatabase : RoomDatabase(){
// DAO 클래스를 추상 함수로 등록해줘야 한다.
abstract fun crimeDao() : CrimeDao
}
위와 같이 추상 함수로 등록해주면 된다.
728x90
반응형
'Programming > Android' 카테고리의 다른 글
Repository Pattern (0) | 2021.07.27 |
---|---|
Layout Design (0) | 2021.07.25 |
Emulator(AVD) & Physical Device (0) | 2021.07.25 |