Room을 사용하다가 만난 문제, Build 자체가 안된다.. 답답쓰.. 그동안 Room을 사용하면서 만나본 적 없던 문제라 매우 당황스러웠다. 처음에는 Room 관련 오류인 줄도 몰랐으나 현재 프로젝트에서 kapt를 사용해 라이브러리를 사용하는건 Room 밖에 없었기 때문에 추측할 수 있었다.
> Task :app:kaptDebugKotlin FAILED
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
> java.lang.reflect.InvocationTargetException (no error message)
구글링을 하다보면 수많은 해결법이 나오지만 상황에 따라 다르기 때문에 시도했던 방법들을 소개하려한다.
먼저, 위에서 'kapt'를 언급했다는 이유로 'kapt'를 'annotationProcessor'로 바꾸면 되지 않나요? 라고 생각할 수도 있다. 실제로 이런 해결법을 제시하는 글도 많다. 하지만 Kotlin은 kotlinc로 컴파일되기 때문에 기존 Java로 작성된 Annotation Process로는 Kotlin의 Annotation이 제대로 처리되지 않는다. annotationProcessor를 써봤자 Build는 성공할지 몰라도 아래와 같은 오류를 만나게 될 것이다.
java.lang.RuntimeException: cannot find implementation for hbs.com.timetablescreen.Utils.AppDataBase. AppDataBase_Impl does not exist
❗️ kapt로 선언해주는 것은 필수 ❗️
dependencies {
// annotationProcessor -> kapt
kapt "androidx.room:room-compiler:$roomVersion"
}
모듈 수준의 build.gradle(Module:프로젝트명.app)의 dependencies에 아래 코드를 추가한다.
dependencies {
kapt "org.xerial:sqlite-jdbc:3.34.0"
}
맥북 M1을 사용하는 사람들에게 제일 많이 제시되는 해결책이다. 나 또한, 맥북 M1을 사용하고 있어 제일 먼저 시도한 방법이지만 해결하지 못했다..^_ㅠ
현재 Room 4.2.0(현 시점 안정화 된 최신버전)을 사용중인데, Room 4.1.0 부터 M1 칩을 지원하도록 버그가 수정되었기 때문에 4.1.0 이상의 버전을 사용하는 사람들에게 위의 방법은 소용이 없다. (4.1.0 이하를 사용하는 사람들은 해결했다는 글이 많다!)
프로젝트 수준의 build.gradle(Project:프로젝트명)의 plugins에서 kotlin 버전을 '1.5.31'으로 설정한다.
plugins {
id 'org.jetbrains.kotlin.android' version '1.5.31' apply false
}
다른 방법도 많이 시도해봤지만 필자는 버전을 낮추니 마법처럼 해결 되었다...⭐️
Kotlin 버전을 딱히 이유 없이 무조건 최신으로 맞췄던 나.. 이번 오류는 이러한 생각을 반성하는 계기가 되었던 오류였다. 라이브러리든 Kotlin 버전이든 서로 호환이 되는 버전을 확인하여 적용시키는게 중요하다는 것을 깨닫게 되었다.