본문 바로가기
안드로이드/코틀린

안드로이드 Room in jetpack 이해와 사용방법

by 시작이반의반 2023. 2. 17.

안드로이드 Room in jetpack

안드로이드 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

 

 

 

 

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()
    }
}

 

 

관련 글

 

안드로이드 Room 쿼리(Query) 정리

 

안드로이드 Room 쿼리(Query) 정리

안드로이드 Room을 사용할 때 데이터베이스와 상호작용하기 위해서 데이터 액세스 객체(DAO)를 구현합니다.DAO 안에는 상호작용을 정의하는 메서드를 가집니다.해당 메서드에 대해서 간단하게 살

joo-selfdev.tistory.com

 

참고자료

 

Room을 사용하여 로컬 데이터베이스에 저장

 

Room을 사용하여 로컬 데이터베이스에 데이터 저장  |  Android 개발자  |  Android Developers

Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기

developer.android.com

Room 항목을 사용하여 데이터 정의

 

Room 항목을 사용하여 데이터 정의  |  Android 개발자  |  Android Developers

Room 라이브러리의 일부인 항목을 사용하여 데이터베이스 테이블을 생성하는 방법 알아보기

developer.android.com

Room DAO를 사용하여 데이터 액세스

 

Room DAO를 사용하여 데이터 액세스  |  Android 개발자  |  Android Developers

Room 라이브러리의 일부인 DAO(데이터 액세스 개체)를 사용하여 데이터베이스 테이블을 수정하는 방법 알아보기

developer.android.com

댓글