[Android] Room 소개
안드로이드 Jetpack의 ORM라이브러리 중 하나인 Room에 대해 포스팅 해보고자 합니다.
Room
Room은 SQLite에 대한 추상화 레이어를 제공하여 원활한 데이터베이스 액세스를 지원하는 동시에 SQLite를 완벽히 활용할 수 있게 해줍니다.
Room을 사용하려면 Entity에 해당하는 class, Dao에 해당하는 interface 그리고 RoomDatabase에 해당하는 class가 필요합니다. 그리고 DB는 background에서 동작해야 합니다.
Room의 구성요소간의 의존 관계
Entity
● Room 작업시 데이터베이스 테이블을 설명하는 주석이 달린 클래스 입니다.
● @Entity로 주석을 달아야 합니다.
● 각 엔티티에 대해 아이템을 보관하기 위해 연결 된 데이터베이스 객체 내에 테이블이 생성됩니다.
Dao
● data access object. 데이터베이스에 접근할 수 있는 메소드를 포함합니다.
● 데이터에 접근하려면 Dao를 사용해야합니다.
● 각각의 Dao에는 앱의 데이터베이스에 대한 추상적 액세스를 제공하는 방법이 포함되어 있습니다.
이 Dao 객체들은 룸의 주요 구성요소를 형성합니다.
● Dao는 interface 혹은 abstract class 일 수 있습니다.
● query builder 나 직접적인 query문 대신 Dao를 이용하여 데이터베이스에 접근해, 구조의 다양한 요소를 분리할 수 있습니다.
RoomDatabase
● Dao를 사용하여 SQLite 데이터베이스에 쿼리를 실행합니다.
● @Database로 주석을 달아야 하며, 다음 조건을 만족해야 합니다.
● Room database를 상속받는 클래스는 추상 클래스이어야 한다.
● 주석 내에 데이터베이스와 연관된, Entity의 목록을 포함해야 한다.
● parameter가 0개인 추상 메소드를 포함하고 Dao 클래스를 반환한다.
Room과 SQLite의 비교
Room이 추가되고 나서 android 공식 개발문서에서는 다음과 같이 권장하고 있습니다.
SQLite 대신 Room을 사용하는 이유
1. Room은 SQLite에 대한 추상화 레이어를 제공하여 원활한 데이터베이스 액세스를 지원하는 동시에 SQLite를 완벽히 활용할 수 있게 해줍니다.
2. SQLite는 컴파일 중 유효성 검사를 못하지만, Room은 유효성 검사 기능이 있어 가능합니다.
3. Schema가 변경될 시 자동으로 업데이트 해줍니다.
4. Java 데이터 객체를 변경하기 위해 query문 없이 ORM 라이브러리를 통해 맵핑 합니다.
5. LiveData와 RX-Java 를 위한 Observation 생성 및 동작을 가능하게 합니다.
예제 (Room, MVVM(DataBinding)) : https://github.com/leechg31/Android-Jetpack-Room