❓ 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에 대해서도 개념을 다시 공부해보는 시간을 가졌다.
개념이 중요하다는걸 다시한번 느꼈고... 매번 개념을 상기시키면서 코드를 구현해야겠다는 생각을했다...
'Android > Jetpack' 카테고리의 다른 글
[Android/Kotlin] Paging3란? (2) | 2025.07.03 |
---|---|
[Android/Kotlin] 프래그먼트간 데이터를 공유하는 ViewModel (0) | 2024.06.05 |
[Android/Kotlin] Navigation Component 구현 (0) | 2024.05.28 |
[Android/Kotlin] Hilt란? (0) | 2024.05.24 |