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


0 Comments

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다