"Room은 SQLite에 대한 추상화 레이어를 제공하여 원활한 데이터베이스 액세스를 지원하는 동시에 SQLite를 완벽히 활용합니다." https://developer.android.com/training/data-storage/room
Room은 ORM 라이브러리!? 그게 뭔디?
ORM은 Object-Relational-Mapping으로 관계형 DB는 테이블을 사용하고 객체 지향 프로그래밍은 객체를 사용하기 때문에 불일치가 발생, 클래스와 테이블을 매핑하고 변환하여 일치시켜게 만드는 기술이 ORM 기술!
그냥 쉽게 말해서, Room은 어플리케이션에서 데이터를 저장할 때 휴대폰 내장 데이터베이스를 이용하게 되는데, 이 때 쉽게쉽게 작성하게 도와주는 라이브러리!
SQLite는 컴파일시 쿼리에 대한 에러를 확인하지 못하지만, Room은 쿼리 유효성 검사를 할수 있어!
SQLite는 schema 가 변경이 될때 SQL 쿼리를 수동으로 업데이트 해야하지만 Room은 쉽게 업데이트가 가능해!
SQLite는 ORM을 지원하지 않아서, 데이터를 객체로 변환하는 작업을 거쳐야해.
Room은 LiveData와 같은 옵저버 패턴의 데이터를 다룰 때 Observation 으로 생성하여 동작할 수 있지만 SQLite는 할 수 없어.
- DAO(Data Access Objects)
여기는 인터페이스 형태로 만들어서 데이터베이스에 수행할 메서드를 정의 해두는 곳이야!
- Entity는 데이터베이스의 테이블을 클래스로 정의한 곳이야!
- Room Database
Entity, DAO를 통합적으로 묶어서 데이터베이스를 생성하거나 버전 관리를 하는 추상 클래스야.
위에 세개를 보았을때 뭐 부터 만들어야 할까?
👆 처음에는 Entity를 먼저 정의해야해!
@Entity
data class Todo(
val title: String,
val description: String?,
val isDone: Boolean,
@PrimaryKey val id: Int? = null
)
✌ 두 번째는 Dao를 정의해야 돼! Database안에 Dao를 정의해야되니깐!
@Dao
interface TodoDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertTodo(todo: Todo)
@Delete
suspend fun deleteTodo(todo: Todo)
@Query("SELECT * FROM todo WHERE id = :id")
suspend fun getTodoById(id: Int): Todo?
@Query("SELECT * FROM todo")
fun getTodos(): Flow<List<Todo>>
}
💪 마지막으로 Room Database 정의하기!
@Database(
entities = [Todo::class],
version = 1
)
abstract class TodoDatabase: RoomDatabase() {
abstract val dao: TodoDao
}
@Database(entities = arrayOf(RoomCalendar::class), version = 1, exportSchema = false)
abstract class RoomHelper: RoomDatabase() {
abstract fun roomCalendarDao(): RoomCalendarInterface
companion object{
private var instance: RoomHelper?= null
@Synchronized
fun getInstance(context: Context): RoomHelper? {
if (instance == null) {
synchronized(RoomHelper::class) {
instance = Room.databaseBuilder(
context.applicationContext,
RoomHelper::class.java,
"room-helper"
).build()
}
}
return instance
}
}
}
위 코드는 RoomDatabase를 선언할때 싱글턴으로 DB를 초기화하는 코드!
//in mainActivity
helper = RoomHelper.getInstance(mainActivity)!!
helper.roomCalendarDao().getAll()
Activity에서 그냥 한줄 코드로 DB를 쉽게 생성하고 접근할 수 있어!
위 방법이 없었으면 그냥 쓸때마다 Builder 만들어가지고 context 넣고~ 😂
이제는 그냥 의존성 주입(di)를 이용하여 한줄 코드도 적을 필요가 없어졌음!
다음 편에서 DI(Dependency Inject)에 대해서 다루어 보도록 해볼게!
https://developer.android.com/training/data-storage/room
https://velog.io/@gang_shik/Android-Room
https://velog.io/@dev_jin/AndroidKotlin-Room
https://velog.io/@hyunho058/Room
https://velog.io/@l2hyunwoo/Android-JetPack-Room