org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering

이지훈·2023년 4월 28일
0
post-custom-banner

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 가 뜬다는 것을 알게되었다.

고치고 나서 보면 굉장히 기초적인 에러인것 같지만, 처음 보는 에러로 당황하시는 분들 위해 정리 해보았다.

Kotlin Backend Exception 라는 에러가 발생한 이유

이 에러가 발생한 과정을 단계별로 살펴보면:

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 컴파일러 파이프라인:

  1. Frontend

    • 소스코드 파싱
    • 문법 검사
    • AST(Abstract Syntax Tree) 생성
  2. Middle-end

    • IR(Intermediate Representation) 생성
    • 코드 최적화
  3. Backend

    • IR을 타겟 플랫폼 코드로 변환
    • JVM 타겟의 경우: IR -> JVM 바이트코드
    • Native 타겟의 경우: IR -> LLVM IR -> 기계어
    • JS 타겟의 경우: IR -> JavaScript 코드
      이 에러의 경우:
      Copyorg.jetbrains.kotlin.backend.common.BackendException

org.jetbrains.kotlin.backend: Kotlin 컴파일러의 Backend 모듈을 나타냄
common: 여러 타겟(JVM, JS, Native)에서 공통으로 사용되는 Backend 코드
BackendException: Backend 단계에서 발생한 예외

특히 에러 메시지에 나온:
Copyorg.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen
이 부분은 JVM 바이트코드를 생성하는 Backend 코드임을 명확히 보여줍니다.
따라서 이 에러는 Kotlin 컴파일러의 Backend 단계, 즉 최종 실행 코드를 생성하는 과정에서 발생한 것이 맞습니다.

profile
실력은 고통의 총합이다. Android Developer
post-custom-banner

1개의 댓글

comment-user-thumbnail
7일 전

에러 발생 이유 추가 보충 예정

답글 달기