Spring/Spring 팁

Kotlin과 all-open

E145 2022. 2. 14. 00:52
반응형

Kotlin에서 open이란?

 

코틀린에는 자바에는 없는 open 키워드가 존재한다.

 

자바와 달리 코틀린에서 클래스나 메소드를 선언하면, 기본으로 final 키워드가 적용된다.

 

open 이라는 키워드를 명시하면, 자바의 기본 값 처럼 final 키워드가 명시되지 않는다.

 

코틀린과 자바는 상호 호환이 가능하지만, 몇 가지 설정이 필요한 경우가 있다.

 

Spring에서도 대부분 호환이 가능하지만, open 키워드 때문에 문제가 발생한다.

 

Kotlin과 Spring Bean

코틀린에서 Spring Bean을 등록하는 방법. @Configuration & @Bean Spring에서 Bean을 등록하는 방법은 여러가지가 존재한다. 그 중 @Configuration과 @Bean을 이용하여 Spring Bean을 등록할 수 있다. // Java 에..

9327144.tistory.com

 

 

all-open 플러그인

 

그렇다면, Spring에서 @Configuration이나 @Transactional을 사용하기 위해서 클래스나 메소드에 모두 open 키워드를 직접 달아주어야 할까?

 

이러한 불편함을 해결하기 위해 all-open이라는 플러그인이 존재한다.

 

말 그대로, Spring에서 open이 필요한 클래스나 메소드에 자동으로 open이라는 키워드를 명시해주는 플러그인이다.

 

 

all-open 플러그인 사용 전

 

all-open 플러그인 사용 전 상태를 살펴보자.

 

open 키워드가 없는 클래스와 메소드

이렇게 Transactional을 사용하기 위해서는 open 키워드가 필요하지만 선언하지 않는 경우를 살펴보자.

 

 

코틀린 코드를 빌드한 후 java 코드로 디컴파일 하게 되면 위와 같은 코드의 상태를 얻을 수 있다.

 

 

실행 시 당연하게도 Bean으로 등록할 수 없다.

 

all-open 키워드 사용 후

 

 

클래스와 메소드 코드에는 변함 없이 all-open 플러그인을 추가한 후 빌드하게 되면

위와 같이 final 키워드가 제거됨을 볼 수 있다.

 

all-open 플러그인 등록

 

위와 같이 설정을 하면, all-open 플러그인을 사용할 수 있다.

 

Gradle

plugins {
  id "org.jetbrains.kotlin.plugin.spring" version "1.6.10"
}

 

Maven

<compilerPlugins>
	<!-- Spring 어노테이션에 open 키워드를 사용한다고 명시  -->
    <plugin>spring</plugin>
</compilerPlugins> 

<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-maven-allopen</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>

 

출처 : https://kotlinlang.org/docs/all-open-plugin.html#spring-support

 

All-open compiler plugin | Kotlin

 

kotlinlang.org

 

 

반응형