may not be final 해결하기

김대니·2022년 12월 3일
0

Kotlin

목록 보기
3/3

문제 상황

코틀린으로 개발을 하다가 아래와 같은 에러가 발생했습니다.

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 클래스

자바에서 배운것을 생각해보면 final 클래스는 상속이 불가능합니다.

그럼 모든 코틀린 클래스는 상속이 불가능할까요?

그렇지는 않습니다.

@Configuration 은?

@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")

참고
https://cheese10yun.github.io/spring-kotlin/

profile
?=!, 물음표를 느낌표로

0개의 댓글