가시밭길이었던 Room 적용 과정

김태영·2024년 7월 30일
0

TIL

목록 보기
58/70
post-thumbnail

오늘 공부한 것

- 알고리즘 소수 찾기 문제 풀이
- 앱개발 심화 주차 강의 듣기

room 세팅하기

처음에는 예제 코드를 보면서 그대로 따라해보려고 했다. 그러나 강의 버전과 내가 실습하고 있는 버전은 뇌 빼고 복붙하기엔 상당히 다른 문법을 갖고 있어서 적용하는 데에 어려움을 겪었다. 먼저 참고한 예제 코드는 다음과 같다.

// build.gradle (Module :app)
plugins {
		...
    id 'kotlin-kapt'
}

...

dependencies {
    ...
    def room_version = "2.5.1"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    // optional - Kotlin Extensions and Coroutines support for Room
    implementation "androidx.room:room-ktx:$room_version"
    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"
}

이걸 내가 실습하고 있는 버전에 맞춰 변경해 작성해줘야 한다.

1. libs.versions.toml

간단히 하려면 문자열을 괄호로만 감싸주면 끝나는 문제긴 하지만, 경고 표시가 뜨는 게 거슬리니까 따로 버전 카탈로그를 작성해주기로 했다.

[versions]
room = "2.5.1"

[libraries]
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
androidx-room-testing = { group = "androidx.room", name = "room-testing", version.ref = "room" } 

2. build.gradle.kts (Module :app)

버전을 다 적어주었다면 이제 gradle 파일만 작성해주면 끝이난다.

plugins {
    ...
    kotlin("kapt")
}

dependencies {
    implementation(libs.androidx.room.runtime)
    annotationProcessor(libs.androidx.room.compiler)
    kapt(libs.androidx.room.compiler)
    implementation(libs.androidx.room.ktx)
    testImplementation(libs.androidx.room.testing)
}

3. error

error: Not sure how to convert a Cursor to this method's return type

설정을 다 해주고 Sync까지 마치고 난 뒤 실행을 하는 데 위와 같은 에러가 발생했다. 강의에서 준 예제 코드라 코드 자체가 틀릴 가능성은 거의 없을 텐데, 검색을 해보니 자꾸 suspend 키워드를 없애라느니 반환형을 LiveData나 Flow로 감싸라느니 등등 코드를 고치라는 해결책만 나왔었다.

사실 결과로 나온 방법들을 다 해보긴 했는데, 결국 돌아돌아 gradle 설정으로 돌아와보니 내가 작성해둔 room 버전보다 더 최신 버전이 있으니까 그거로 변경하라는 경고 문구가 띄워져 있었다. 그렇게 “2.5.1”에서 “2.6.1”로 변경하니까 거짓말처럼 실행이 되었다.

여태 각 플러그인이나 라이브러리의 버전들에 관심이 없었는데, 앱이 죽을만큼 치명적인 문제가 발생하기도 하는구나라는 것을 알게되었다.

ksp 설정

위에서 kapt로 종속성을 추가할 경우에 다음과 같은 경고 문구가 나올 것이다.

Learn more 링크에 들어가서 문서를 확인해보면 다음과 같이 나와있다.

kapt는 Kotlin 코드에서 자바 주석 프로세서를 사용할 수 있습니다. KSP는 Kotlin 코드를 직접 분석하기 때문에 시간이 최대 2배 빠릅니다. 또한 Kotlin의 언어 구성을 더 잘 이해합니다.

경고긴 하지만 2배 빠른 걸 어떻게 참겠는가. 냅다 바로 적용해보기로 했다.

1. libs.versions.toml

마찬가지로 버전 카탈로그에 버전을 작성해주자.

[versions]
kotlin = "1.9.0" // 에는
ksp = "1.9.0-1.0.13" // 사용하자...

[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

2. build.gradle.kts (Project: ...)

ksp 자식.. 특이하게도 project gradle 파일까지 건드려야 하는 녀석이었다.

plugins {
    ...
    alias(libs.plugins.ksp) apply false
}

3. build.gradle.kts (Module :app)

앱 수준 gradle 파일도 수정을 해주면...! 끝이 난다!

plugins {
    ...
    kotlin("kapt") // 대신
    alias(libs.plugins.ksp) // 사용!
}

error

ksp 적용하면서도 계속 Sync 오류가 나서 또 찾아보니, kotlin 버전에 맞는 ksp를 추가해야 한다고 한다. 그래서 문서에 있던 링크에 들어가 1.9.0을 찾아 변경해주었다.

마치며

어유 이놈의 버전은 너무 어려운 것 같다. 알아서 충돌 안나는 버전으로 깔려줬으면 좋겠다. 알아보면 있긴 하겠..지..?

profile
화이팅

0개의 댓글