티스토리 뷰

반응형

Author: 니용

 


Kotlin으로 개발 도중 Java에서 지원해주던 Lombok을 사용할 수 없는 증상이 발생하였습니다.

검색을 해보니 Kotlin은 Compile을 하는 프로세스가 Java와 다르기 때문에 이런 증상이 발생하였는데요, 정확한 사유는 이를 사용하는 Gradle의 특징을 먼저 알아야 합니다.

 

Gradle

build.gradle 파일에서 왠만한 그래들의 정의가 이루어집니다. 

정의가 이루어질때, implementation이나 compileOnly, runtimeOnly 등 이전에 사용했던 방식을 Kotlin에 넘어와서도 그대로 사용하였습니다. 

 

보통 build.gradle 파일에서는 이와 같이 Lombok을 사용하기 위해 선언해두었습니다.

//...

compileOnly('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')

//...

 

 

좋은 예시가 아래에 있습니다.

build.gradle에서 생성을 할 때 접근하는 순서

위의 도식도를 보시면 제일 먼저 생성되는 순서가 왼쪽부터 오른쪽의 순서로 정렬이 되어 있습니다.

comipleClasspath에서는 compileOnly와 implementation으로 접근이 가능하지만, 프로젝트가 컴파일된 후 compileOnly는 소멸됩니다. 프로그램의 메모리 내에 적재되어 있는 메소드는 implementationruntimeOnly의 두가지 상태값입니다.

 

Tip: 컴파일로 나온 결과물이 .class 파일에 저장됩니다.

 

Java에서 Lombok은 compileOnly를 사용하여 생성되었습니다. 이유인 즉슨, compile 단계에서 메소드를 생성하고 그에 대한 접근 제어자를 생성하는데, implementation(구현체) 단계에서 메모리에 계속 상주하고 있을 필요가 없기 때문입니다. 

 

실제로 WAS에 상주되어 있는 정보는 runtimeClasspath에서 작동하고 있기에 reach range가 compileOnly에 못미칩니다. 

 

Java Virtual Machine

일반적으로 JVM에서는 Kotlin이 먼저 컴파일이 된 후에 Java가 컴파일을 진행하게 되는데, gradle 파일에 compileOnly로 생성하게 되면 Java에서 진행을 하는 것과 같은 방식으로 이루어집니다. 그렇다보니 순서가 어긋나죠.

 

컴파일을 진행하면 프로젝트에서 이와 같은 오류가 발생할 것입니다.

fun usingLombokError() {
   val abbo = Abbo("nickname", 111)
   println(abbo.nickname) // Error: Cannot access 'nickname': it is 'private' in "Abbo"
}

 

Solution

1. 이를 해결하기 위해 kapt 플러그인을 적용하여야 합니다.

apply plugin: 'kotlin-kapt'

dependencies {  
    kapt "com.querydsl:querydsl-apt:4.2.1:hibernate"
}

2. Maven을 사용하신다면 여기 링크로 가서 설정값에 맞게 적용하셔도 사용가능하시고, Gradle을 사용하시는 것도 방법이 있습니다. 

 

3. 혹은, data class를 사용하는 것도 하나의 방법입니다. 

 

반응형
댓글
공지사항