본문 바로가기
Android/Jetpack

[Android/Kotlin] Room의 3요소와 역할은 뭘까?

by juwon2 2024. 6. 23.

 

 

 RoomDB 란??

SQLite 데이터베이스를 더 쉽게 사용할 수 있도록 도와주는 ORM(Object-Relational Mapping) 라이브러리다.

RoomDB를 사용하면 DB와 앱 간의 데이터 작업을 간소화하면서도, SQLite의 강력한 기능까지 활용할 수 있다는 이점이 있다.

 

주요특징

  • SQLite위에서 작동해서, 복잡한 SQL쿼리를 작성하지 않고 데이터 효율적으로 관리가능
  • 컴파일시점에 SQL문법검사를 수행해, 오류 줄여줌 (런타임 오류 감소)
  • 테이블과 객체간의 변환이 자동으로 처리됨 (데이터 매핑)
  • Room은 LiveData, Flow같은 라이프사이클 인식컴포넌트와 잘 통합되어, 반응형 프로그래밍에 적합
  • 백그라운드 작업최적화
    -> 데이터 작업은 기본적으로 백그라운드 스레드에서 수행하도록 되어있는데, 얘는 (메인스레드에서 작업하면 충돌하게 설계되어있어서) 백그라운드 작업을 최적화해줌

 

SQLite와 Room을 비교했을때, Room을 사용하는 이유는?

위에서 설명했다싶이, 해당 이유때문에 안드로이드에서는 Room을 더 많이 사용한다.

  • 복잡한 SQL쿼리를 작성하지않고도, + SQLite를 완벽히 활용가능
  • 런타임 오류를 방지할 수 있음
  • LiveData, Flow같은 컴포넌트와 통합이 잘됨 → 반응형 프로그래밍에 적합
  • 코드 간결유지보수 쉬움

 

Room의 3요소와 역할??

Room의 3요소는 Entity, Dao, Database 가 있다.

 

Entity

  • 데이터베이스 테이블을 나타내는 클래스
  • 각 필드는 데이터베이스 테이블의 열(column)에 해당 -> 클래스 자체가 테이블로 간주
  • @Entity 어노테이션을 사용해, 테이블로 정의
@Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    val age: Int
)

 

Dao

  • 데이터베이스에 접근할 수 있는 인터페이스
  • @Dao 어노테이션을 사용해, SQL쿼리를 간단한 메서드 호출로 사용가능
  • @Insert, @Update, @Delete, @Query 와 같은 어노테이션을 사용해, 간단하게 삽입,업데이트,삭제 등을 할 수 있음
@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Query("SELECT * FROM user_table WHERE id = :id")
    suspend fun getUserById(id: Int): User?

    @Delete
    suspend fun delete(user: User)
    
    @Query("SELECT * FROM users")
    fun getAllUsers(): LiveData<List<User>>
}

 

-> interface에 suspend 키워드를 사용해, 비동기처리를 권장함

-> 복잡한 쿼리는 @Query를 사용해, SQL문법을 확용해 작성해야함

-> 데이터베이스의 변경을 실시간으로 반영해야하면, 반환값을 LiveData나 Flow를 통해 반환하면됨

 

 

Database

  • Entity와 Dao를 연결하는 역할 (앱에서 DB에 접근할 수 있는 진입점 역할)
  • @Database 어노테이션을 사용해 정의
  • 데이터베이스가 업데이트되었을경우, 여기서 버전을 올려주고 마이그레이션을 해야함
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

 

💡마치며..

같이 쓰이는 interface와 suspend fun에 대해서도 개념을 다시 공부해보는 시간을 가졌다.

개념이 중요하다는걸 다시한번 느꼈고... 매번 개념을 상기시키면서 코드를 구현해야겠다는 생각을했다...