코틀린으로 개발을 하다가 아래와 같은 에러가 발생했습니다.
Configuration problem: @Configuration class '...' may not be final. Remove the final modifier to continue...
@Configuration
가 포함된 클래스는 final
이 될 수 없다는 에러 메시지입니다.
코틀린에서는 클래스에 기본적으로 final
키워드가 추가되어 컴파일되게 됩니다.
예를 들어, 아래와 같이 final
키워드가 없이 코드가 작성되어도,
class SampleClass {
fun sampleMethod() {
...
}
}
아래 코드와 동일하게 작동되게 됩니다.
public final class SampleClass public constructor() {
public final fun sampleMethod(): kotlin.Unit {
...
}
}
자바에서 배운것을 생각해보면 final
클래스는 상속이 불가능합니다.
그럼 모든 코틀린 클래스는 상속이 불가능할까요?
그렇지는 않습니다.
@Configuration 어노테이션이 부여된 클래스는 CGLib (Code Generate Library) 에 기반하여 Proxy 클래스가 생성되며 Target 클래스를 상속받아 생성하게 됩니다. (@Configuration 어노테이션 뿐만 아니라 @Transactional 등 다른 어노테이션도 비슷하게 Proxy 클래스가 생성됩니다.)
Proxy 클래스는 Target 클래스를 상속받아 생성하게 되는데, 코틀린에서는 기본적으로 모든 클래스가 다 final
이기 때문에 open
키워드를 사용하여 상속이 가능한 형태로 변경해주어야 합니다.
이를 해결하기 위해서는 아래와 같이 코드를 작성해주면 됩니다.
open class SampleClass {
fun sampleMethod() {
...
}
}
라고 생각이 들어서 관련 라이브러리를 찾아보았습니다.
찾아보니 아래 라이브러리를 사용하면 자동으로 open 키워드를 붙여 Proxy 클래스를 생성해준다고 합니다.
apply(plugin = "org.jetbrains.kotlin.plugin.spring")