본문 바로가기
개발/Android

[Android Dev Summit ’19] What’s New in Room – 정리

by Dev Aaron 2020. 11. 8.
반응형

다소 늦은 감이 있지만, 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 없이 정상 동작한다고 합니다.

반응형