티스토리 뷰
Room Persistence Library
: SQLite 객체 매핑 라이브러리
(Android Jetpack의 구성요소)
특징
- 상용구 코드(boilerplate code)를 피하고, SQLite 테이블 데이터를 자바 객체로 쉽게 변환 가능
- SQLite 에 대한 완벽한 활용이 가능하며, 데이터 베이스 액세스를 지원하는 추상화 계층을 제공
- 기기 내에 캐시를 만들 수 있어, 인터넷 연결 여부와 관계 없이 일관된 형태로 데이터 제공
- Less boilerplate code
- Compile-time checked queries
- Ease of implementing migrations
- High degree of testability
- Keeping database work away from the main thread.
boilerplate code : 수정하지 않거나, 적은 양의 수정만을 필요로 하며, 여러곳에서 필수적으로 사용하는 코드 - 재사용가능한 코드 - boilerplate code를 피해야 하는 이유 최소한의 작업을 위해 많은 분량의 코드를 작성하게 됨. |
구성 요소
: RoomDatabase 내에 entity와 dao가 포함된다.
- Entity : 데이터베이스 내에 생성될 테이블 정의
@Entity(tableName="TABLE_NAME") : data 클래스에 해당 어노테이션을 이용하여 Entity임을 정의하고, 테이블 명을따로 설정할 수 있음
@ColumnInfo(name="COLUMN_NAME") : 테이블에 저장될 컬럼명을 설정할 수 있음
- Dao : 데이터베이스 내의 데이터를 접근하기 위한 객체
@Dao : 해당 어노테이션을 이용하여 Dao 객체를 Interface로 정의함
Room에서 제공하는 메소드
@Insert : 단일 트랜잭션으로 모든 매개변수를 데이터베이스에 삽입하도록 구현되어 있음
@Update : 동일한 primary key 를 통해 변경된 항목을 수정하도록 구현되어 있음
@Delete :
@Query : 만약 리턴 값이 없을 경우 Optional을 적용
@RowQuery : "SupportSQLiteQuery" 를 이용하여 query를 작성하는 메소드
( * RowQuery를 제외한 나머지 메소드들은 컴파일 타임에서 빌드되기 때문에 Exception 발생을 즉시 알 수 있음, RowQuery는 런타임 시에 빌드 됨 )
- 데이터베이스의 데이터 접근 시 발생하는 에러
java.lang.IllegalStateException : main thread에서는 database에 접근할 수 없음!! - 잠재적으로 ui thread에 대한 응답이 오래 걸릴 수 있기 때문에 ...
Asynchronous queries : 메소드를 비동기식으로 설정, 메인 스레드에서 이러한 메서드를 실행할 수 없음
- Maybe<T>
- Single<T>
Observable queries : 쿼리 실행을 통해 데이터 변경 시 앱 UI가 자동으로 업데이트 되기를 원할 때 LiveData 유형을 반환 값으로 사용.
- LiveData<T>
- Flowable<T>
- Database Migrations : 데이터베이스 변경(스키마 변경, 컬럼 추가, 타입 변경, 이름 변경 등)데이터베이스에게 어떻게 처리시킬 것인지 알려줘야 함.
처리 순서
1) 데이터베이스 버전 변경
2) 어떻게 통합시킬 것인지 설정
3) 데이터베이스 빌드 시 설정한 Migrations 추가
- 만약 통합을 원하지 않는다면, fallbackToDestructiveMigration 메소드를 이용하여 데이터베이스를 제거하고 다시 생성한다.
데이터베이스 테스트
: JUnit을 이용하여 테스트 실행 (AndroidJUnit4)
Room의 InMemoryDatabaseBuilder를 이용함 - InMemory는 실행이 종료되면 데이터베이스가 destroy 되기 때문에 테스트 시 많이 사용함.
( + 유튜브의 Android Jetpack: Room 을 통해서 다양한 테스트 팁을 확인할 수 있음)
*boilerplate code
https://ko.wikipedia.org/wiki/%EC%83%81%EC%9A%A9%EA%B5%AC_%EC%BD%94%EB%93%9C
* Room
-https://developer.android.com/topic/libraries/architecture
-https://www.youtube.com/watch?v=SKWh4ckvFPM
-https://developer.android.com/reference/androidx/room/RawQuery
-https://developer.android.com/training/data-storage/room/accessing-data?hl=ko