안드로이드 jetpack compose 중에 하나로 Room에 대해 알아보려고 합니다.
해당 내용은 Room에 대한 이해와 기본적인 사용방법을 다루고 있습니다.
Room 이란?
Android Jetpack 라이브러리의 구성요소 중 하나입니다.
Room을 활용하여 원하는 데이터를 로컬 데이터베이스에 저장, 유지할 수 있습니다.
많은 양의 데이터를 지속적으로 관리해야 할 때 사용합니다.
예를 들어 앱이 종료되어도 데이터가 유지돼야 하거나,
네트워크 접근 없이 사용자에게 오프라인으로도 제공돼야 하는 데이터인 경우 활용할 수 있습니다.
Room 구성 요소
3가지 구성요소를 가집니다.
- Database Class : 데이터 연결을 위한 기본 액세스 포인트 역할
- Entitiy : 데이터베이스 테이블
- Data Access Object (DAO) : 데이터에 접근할 수 있는 객체로 쿼리, 업데이트, 삭제 등등의 메서드 제공
개인적으로 순서를 두고 이해하려고 노력했습니다.
가장 먼저 데이터 연결을 위한 (1) Database Class를 만들어 준다.
어떤 데이터를 관리할 건지 (2) Entity를 정의한다.
마지막으로 Database의 데이터를 접근하기 위한 (3) Data Access Object (Dao)를 구현한다.
Room 시작하기
Room 라이브러리를 사용하기 위해서 아래와 같이 gradle에 추가해 줍니다.
plugins {
id 'kotlin-kapt'
}
dependencies {
// Room
implementation 'androidx.room:room-runtime:2.5.0'
kapt 'androidx.room:room-compiler:2.5.0'
}
Database
- @Database를 통해 데이터베이스와 연결할 entities 항목과 version 정보를 포함하여 상단에 배치합니다.
- RoomDatabase를 확장하는 추상 클래스여야 합니다.
- DAO 클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 합니다.
- 데이터베이스의 여러 인스턴스가 동시에 접근하는 것을 막기 위해 싱글톤 사용을 추천드립니다.
@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
// Singleton prevents multiple instances of database opening at the
// same time.
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context): UserDatabase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"database"
).build()
INSTANCE = instance
instance
}
}
}
}
Entity
- @Entity를 통해 테이블명을 설정할 수 있습니다. 따로 설정을 안 하면 Default로 클래스명입니다.
- 고유 식별키로 사용되는 PrimaryKey는 자동으로 할당되도록 하였습니다.
- @ColumnInfo를 통해 필드 이름을 설정할 수 있습니다. 따로 설정을 안 하면 Default는 필드명입니다.
@Entity(tableName = "user")
data class User(
@ColumnInfo(name = "first_name") val firstName: String,
@ColumnInfo(name = "last_name") val lastName: String
) {
@PrimaryKey(autoGenerate = true)
var id = 0L
}
Data Access Object (DAO)
- @Query, @Insert, @Update, @Delete를 활용하여 메서드를 정의합니다.
- DAO에 구현된 메서드를 통해 데이터를 관리할 수 있습니다.
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun loadAll(): 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(onConflict = OnConflictStrategy.IGNORE)
fun insert(user: User)
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insertAll(users: List<User>)
@Update
fun update(users: User)
@Delete
fun delete(user: User)
@Query("DELETE FROM user")
fun deleteAll()
}
사용 예시
private val database = UserDatabase.getDatabase(this)
private val coroutineScope = CoroutineScope(Dispatchers.Default)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
coroutineScope.launch {
database.userDao().insert(User("", ""))
//database.userDao().deleteAll()
//database.userDao().loadAll()
}
}
관련 글
참고자료
'안드로이드 > 코틀린' 카테고리의 다른 글
안드로이드 캡처 효과 예제 : CaptureEffectView (0) | 2024.05.02 |
---|---|
코틀린 화면 캡처 Canvas, PixelCopy 비교 (0) | 2024.04.30 |
Android 14 MediaProjection 권한 허용 : ADB Shell (0) | 2024.04.29 |
안드로이드 이미지 확대 축소 : PhotoView 예제 (0) | 2024.04.25 |
안드로이드 Room 쿼리(Query) 정리 (0) | 2023.02.21 |
댓글