org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: /Users/yijihun/AndroidStudioProjects/KakaoMediaSearch/core/ui/src/main/java/com/kenshi/ui/components/LoadingWheel.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:47)
새로운 모듈을 생성하여 해당 모듈에 Composable 함수를 생성하고, 해당 함수의 preview 를 확인하기 위해 preview code 를 작성한 뒤에 동작 시켜보았는데 다음과 같은 에러가 발생하였다.
package com.kenshi.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@Composable
fun LoadingWheel() {
Box(modifier = Modifier.fillMaxSize()) {
CircularProgressIndicator(
modifier = Modifier
.align(Alignment.Center)
.size(30.dp)
)
}
}
@Preview
@Composable
fun LoadingWheelPreview() {
LoadingWheel()
}
stackOverflow 에 검색 결과들을 확인해보았으나, 만족스러운 답변을 찾지 못하여, 고민을 하였는데
원인은 다음과 같았다.
buildFeatures {
compose = true
}
해당 모듈에 compose를 활성화 시켜주지 않았던 것이었다..!
새로운 모듈을 생성했을 경우 다른 라이브러리 의존성은 다 추가했어도 compose 를 활성화 해주지 않으면 저런 Backend internal error 가 뜬다는 것을 알게되었다.
고치고 나서 보면 굉장히 기초적인 에러인것 같지만, 처음 보는 에러로 당황하시는 분들 위해 정리 해보았다.
이 에러가 발생한 과정을 단계별로 살펴보면:
Compose 관련 설정이 누락된 상황:
Compose 관련 코드(@Composable, @Preview 등)를 사용
하지만 모듈의 buildFeatures { compose = true } 설정이 없음
Kotlin 컴파일러의 동작 과정:
Kotlin 소스코드를 먼저 IR(Intermediate Representation)로 변환
IR을 JVM 바이트코드로 변환하는 과정에서 에러 발생
에러가 Backend Exception으로 나타난 이유:
Compose 컴파일러 플러그인이 활성화되지 않은 상태에서 Compose 관련 어노테이션을 처리하려고 시도
컴파일러가 @Composable이나 @Preview 같은 어노테이션을 이해하지 못함
이로 인해 IR 생성 단계에서 내부 오류(Backend Internal error) 발생
쉽게 설명하자면:
Compose 코드는 특별한 컴파일러 플러그인이 필요함
buildFeatures { compose = true }는 이 플러그인을 활성화하는 설정
이 설정이 없으면 Kotlin 컴파일러가 Compose 관련 코드를 이해하지 못해 Backend Exception을 발생시킴
따라서 이 에러는 "컴파일러가 이해할 수 없는 코드를 만났다"는 의미로 발생한 것입니다. 이는 마치 한국어를 모르는 사람에게 한국어로 된 문서를 번역하라고 요청한 것과 비슷한 상황이라고 볼 수 있습니다. CopyRetryL근데 왜 kotlin BackendException 인겨EditKotlin BackendException이 발생하는 구체적인 이유를 설명드리겠습니다.
Kotlin 컴파일러의 동작 과정을 자세히 살펴보면:
Kotlin 컴파일 파이프라인:
CopyKotlin 소스코드
-> Frontend (구문 분석, AST 생성)
-> Middle (IR 생성)
-> Backend (최종 바이트코드/기계어 생성)
BackendException이 발생한 지점:
에러 메시지: org.jetbrains.kotlin.backend.common.BackendException
발생 위치: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate
이는 컴파일러의 Backend 단계에서 발생한 에러
Backend 단계에서 발생한 이유:
Frontend: 코드 자체는 문법적으로 올바름 (@Composable 등의 구문 분석 가능)
Middle: IR 생성 시도
Backend: Compose 관련 IR을 JVM 바이트코드로 변환하려 할 때 실패
즉, "Backend"Exception인 이유는:
컴파일러가 코드를 읽고 이해하는 것(Frontend)까지는 성공
하지만 실제로 실행 가능한 바이트코드를 생성하는 단계(Backend)에서 실패
Compose 플러그인이 없어서 @Composable을 실제 구현으로 변환할 방법을 몰랐기 때문
이것은 마치 번역가(Frontend)가 문장을 읽을 수는 있지만, 실제 번역 작업을 하는 사람(Backend)이 그 내용을 이해하지 못해 번역을 완료할 수 없는 상황과 비슷합니다. CopyRetryClaude does not have the ability to run the code it generates yet.LKotlin Backend 라는게 kotlin compiler 의 Backend 라는거야? 좀 모호해서Edit네, 정확히 말씀드리면 Kotlin 컴파일러의 Backend를 의미합니다.
Kotlin 컴파일러의 구조를 더 명확하게 설명드리면:
CopyKotlin 컴파일러 파이프라인:
Frontend
Middle-end
Backend
org.jetbrains.kotlin.backend: Kotlin 컴파일러의 Backend 모듈을 나타냄
common: 여러 타겟(JVM, JS, Native)에서 공통으로 사용되는 Backend 코드
BackendException: Backend 단계에서 발생한 예외
특히 에러 메시지에 나온:
Copyorg.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen
이 부분은 JVM 바이트코드를 생성하는 Backend 코드임을 명확히 보여줍니다.
따라서 이 에러는 Kotlin 컴파일러의 Backend 단계, 즉 최종 실행 코드를 생성하는 과정에서 발생한 것이 맞습니다.
에러 발생 이유 추가 보충 예정