Room은 Date 객체를 유지하는 방법을 모르기 때문에 TypeConverter를 정의하여 Long 타입으로 변경하여 저장해야 한다.

class TypeConverters {

    @TypeConverter
    fun toLocalDateTime(timestamp: Long): LocalDateTime {
        return Instant
						.ofEpochMilli(timestamp)
						.atZone(ZoneId.systemDefault())
						.toLocalDateTime()
    }

    @TypeConverter
    fun toTimestamp(date: LocalDateTime): Long {
        return date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
    }
}

위와 같이 TypeConverter를 정의하여 LocalDateTime → Long, Long → LocalDateTime으로 변환하는 방법을 알려주어야 한다.

하지만 LocalDate, LocalDateTime 클래스는 안드로이드 API level 26 이상부터 지원이 된다.

우리 프로젝트는 minSdk가 21이기 때문에 사용하기 위해서 모듈 수준의 build.gradle 파일을 수정할 필요가 있다.

우선 java.time의 하위 클래스를 하위 버전에서 지원하기 위해서는 Android Gradle Plugin 버전이 4.0.0 이상이어야 한다.

android {
    ...
    compileOptions {
        isCoreLibraryDesugaringEnabled = true   // LocalDateTime 이 Api 26 이하 지원을 위해서 추가함.
        ...
    }
    ...
}

dependencies {

    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.0")
    ...
}

coreLibraryDesugaring은 Java 8 API를 지원하기 위해 해당 API의 구현을 포함하는 별도의 라이브러리 Dex 파일을 컴파일하고 이를 앱에 포함한다.

결국 앱의 APK 및 AAR의 용량은 조금 증가했지만, Java 8 API의 호환성을 얻게 된다.

Room을 사용하여 복잡한 데이터 참조 | Android 개발자 | Android Developers

Pluu Dev - Android 호환성 유지에 대한 고찰 ~ 언어편