다소 늦은 감이 있지만, Android Dev Summit 내용을 정리하고자 합니다.
주로 Room 2.2 개선 사항을 다루고 있습니다.
Flow support
Flow가 추가되면서 코루틴을 보다 완벽하게 지원할 수 있게 됨
아래와 같이 Dao 함수에 Flow를 반환하도록 정의할 수 있다.
@Dao
interface DogDao {
@Query("SELECT * FROM dogs")
fun getDogs(): Flow<List<Dog>>
}
Flow를 아직 파악하지 못한 상태인데…
언뜻 보기에는 Rx의 장점을 코루틴에서 취한 형태가 아닐까 짐작해봅니다.
Rx의 장점 중 하나는 다양한 연산자(map, filter)를 통해 데이터 스트림을 조작할 수 있다는 점인데 이를 Flow를 통해 유사하게 처리가 가능한 것 같습니다. 또한 보다 나은 에러 처리 방식을 제공한다고 합니다.
Pre-packaged databases
이 기능은 개인적으로 꼭 필요하다고 느꼈던 부분입니다. 종종 데이터 셋을 미리 DB에 다 넣어놓은 상태로 앱을 출시하고 싶은 경우가 있는데, Room 2.2에서 공식적으로 지원합니다.
Pre-packaged Database를 제공하기 위해 아래와 같이 2가지 새로운 API 중 선택하면 됩니다.
- createFromFile
- createFromAsset
Room.databaseBuilder(appContext, TestDatabase.class, "Sample.db")
.createFromFile(File("mypath")) // NEW!
.build()
Room.databaseBuilder(appContext, TestDatabase.class, "Sample.db")
.createFromAsset("database/myapp.db") // NEW!
.build()
관련하여 한 가지 인지해야 할 점이 있는데, 바로 Migration입니다.
Pre-packaged Database가 version 1이고, 코드에 명시된 version이 3이라면
1 -> 3에 대한 Migration 처리를 반드시 해주어야 합니다.
Relations
@Relation 어노테이션을 컬렉션이 아닌 객체에 추가하여 Room이 인식할 수 있다는 점이 2.2 개선 사항이라고 합니다.
이를 통해 1:1, 1:다, 다:다 관계를 모두 손쉽게 처리할 수 있습니다.
관련된 내용은 공식 문서를 직접 참고하시기 바랍니다.
Schema Default value
아래와 같이 ColumnInfo 어노테이션에 기본 값을 추가할 수 있게 되었습니다.
@Entity
class PetEvent {
val dogId: Int,
val personId: Int,
@ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
val timestamp: Long
}
Gradle Incremental Annotation Processor (experimental feature)
이건 어떤 기능인지 사실 잘 모르겠지만, 빌드 성능 향상에 도움이 되는 기능이라고 하네요.
Expand Projections (experimental feature)
종종 쿼리를 날릴 때 해당 데이터의 모든 컬럼 정보가 아닌 일부 컬럼 정보만 필요한 경우가 있습니다.
그리고 아래와 같이 쿼리를 작성했다고 가정해봅시다.
@Dao
interface DogDao {
@Query("SELECT * FROM dogs")
fun getPups(): List<Pup>
}
SELECT 쿼리의 Projection으로 * 를 사용했기 때문에, 모든 컬럼 정보가 반환되고, 이를 Pup 객체에 담을 수 없기 때문에 Warning이 발생합니다.
하지만 Room 2.2에서는 위와 같은 쿼리는 자동으로 변환되어 처리되기 때문에 Warning 없이 정상 동작한다고 합니다.
'개발 > Android' 카테고리의 다른 글
RecyclerView의 특정 아이템 위치로 이동하기 (0) | 2020.11.08 |
---|---|
Bitbucket Pipeline으로 Android APK 빌드하기 (0) | 2020.11.08 |
[Android] Architecture 정리 – AAC ViewModel, LiveData, Coroutine (0) | 2020.11.08 |
[Android] View Binding (0) | 2020.11.08 |
[Android] Handler Memory Leak (0) | 2020.11.08 |