[서버][스프링][Kotlin] java.lang.ClassNotFoundException: Cannot find implementation for com.dreamaz.gongga.room.model.RoomMapper
문제 현상
잘 동작하던 Java 코드를 Kotlin으로 변경한 후 REST API를 쓰니 아래의 mapstruct 관련 에러가 발생했습니다.
java.lang.ClassNotFoundException: Cannot find implementation for com.dreamaz.gongga.room.model.RoomMapper
원인
kapt를 추가해도 mapstruct 관련 implementation이 생성되지 않았습니다.
어노테이션 프로세서 쪽에서 뭔가가 잘 안되는 것 같습니다.
*kapt 추가했지만 안됨
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</annotationProcessorPath>
<annotationProcessorPath>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
생략
</executions>
생략
</plugin>
해결 방법
IntelliJ에서.. 어째서인지 아직도 빌드/실행 시에 kapt를 포함하지 않습니다.
그래서 annotation proccesor가 필요할 때에는 Maven Project에서 Lifecycle > compile을 클릭하거나 Terminal에 mvn compile을 입력하여 kapt도 수행되도록 해야합니다.
참고
github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-kotlin
kotlinlang.org/docs/reference/kapt.html
[서버][스프링] Mapstruct와 Lombok 동시 사용할 때 주의할 점
stackoverflow.com/questions/47676369/mapstruct-and-lombok-not-working-together
colinch4.github.io/2020-12-03/kotlin_kapt/
코틀린을 사용하면 Lombok을 사용할 필요가 없으므로, Lombok을 모두 제거하고 코틀린으로 변경하거나 자바와 코틀린 코드를 별도의 모듈로 분리하여 관리할 수 있다.
Kotlin Symbol Processing(KSP) 출시!
KAPT 보다 앱 빌드 속도가 2배 빠르다고 합니다.
코틀린 1.4.30 버전부터 호환되구요.
KAPT는 어노테이션 처리를 위해 중간에 자바 Stub을 생성하는 반면에
KSP는 코틀린 코드를 직접 파싱하기 때문에 빠르다고 하네요.
github.com/micronaut-projects/micronaut-core/issues/1936
youtrack.jetbrains.com/issue/KT-15040
댓글 영역