Querydsl crash – lombok plugin

plugin: 'org.jetbrains.kotlin.plugin.lombok

롬복 x 코틀린 오류

롬복과 코틀린을 함께 쓰려고 하면 오류가 많이 발생한다

컴파일타임에 진행되는 일의 순서 때문에 문제가 발생해서 매우 처리하기 힘들다
lombok, kapt, querydsl, protocol buffer, kotlin

이런저런것들이 컴파일타임에 순서대로 돌아가는데
이 오픈소스들이 애초에 이렇게 같이 쓰는 환경을 고려하고 만든게 아닌지라…
자바에서 코틀린 라이브러리를 쓰는 것 조차 쓸 수는 있는정도니까…
꼭 같이 써야겠다면 그레이들에서 모듈을 분리해서 다른 라이브러리를 쓰듯이 만들어 놔야한다
같은 프로젝트에서 같은모듈에서는 그냥 포기하자

lombok

> Task :server:core:compileKotlin
w: Lombok Kotlin compiler plugin is an experimental feature. See: https://kotlinlang.org/docs/components-stability.html.

Lombok Kotlin compiler plugin is an experimental feature. See: https://kotlinlang.org/docs/components-stability.html.

compileKotlin

java.lang.IllegalStateException: Error during writing proto for descriptor: @javax.annotation.Generated public open class QAdminEntity : com.querydsl.core.types.dsl.EntityPathBase<(kr.steppay.account.domain.model.actor.AdminEntity..kr.steppay.account.domain.model.actor.AdminEntity?)> defined in kr.steppay.account.domain.model.actor in file QAdminEntity.java
Source file: /Users/archmagece/work/steppay/account-service/server/domain/build/generated/source/kapt/main/kr/steppay/account/domain/model/actor/QAdminEntity.java
	at org.jetbrains.kotlin.incremental.JavaClassesTrackerImplKt.convertToProto(JavaClassesTrackerImpl.kt:90)
	at org.jetbrains.kotlin.incremental.JavaClassesTrackerImpl$onCompletedAnalysis$2.invoke(JavaClassesTrackerImpl.kt:68)
	at org.jetbrains.kotlin.incremental.JavaClassesTrackerImpl$onCompletedAnalysis$2.invoke(JavaClassesTrackerImpl.kt:67)
	at org.jetbrains.kotlin.util.PerformanceCounter.time(PerformanceCounter.kt:101)
	at org.jetbrains.kotlin.incremental.JavaClassesTrackerImpl.onCompletedAnalysis(JavaClassesTrackerImpl.kt:67)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$invokeExtensionsOnAnalysisComplete(TopDownAnalyzerFacadeForJVM.kt:110)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:129)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:86)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:540)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:531)
	at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:113)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:531)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:188)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:154)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:169)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:90)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:386)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:110)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:303)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl$rebuild(IncrementalCompilerRunner.kt:99)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:124)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:74)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:607)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:96)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1659)
	at jdk.internal.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
	at org.jetbrains.kotlin.lombok.processor.RequiredArgsConstructorProcessor.isFieldRequired(RequiredArgsConstructorProcessor.kt:27)
	at org.jetbrains.kotlin.lombok.processor.RequiredArgsConstructorProcessor.getPropertiesForParameters(RequiredArgsConstructorProcessor.kt:24)
	at org.jetbrains.kotlin.lombok.processor.AbstractConstructorProcessor.contribute(AbstractConstructorProcessor.kt:19)
	at org.jetbrains.kotlin.lombok.LombokSyntheticJavaPartsProvider.computeSyntheticParts(LombokSyntheticJavaPartsProvider.kt:80)
	at org.jetbrains.kotlin.lombok.LombokSyntheticJavaPartsProvider.getSyntheticParts(LombokSyntheticJavaPartsProvider.kt:74)
	at org.jetbrains.kotlin.lombok.LombokSyntheticJavaPartsProvider.generateConstructors(LombokSyntheticJavaPartsProvider.kt:63)
	at org.jetbrains.kotlin.resolve.jvm.CompositeSyntheticJavaPartsProvider.generateConstructors(SyntheticJavaPartsProvider.kt:59)
	at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassMemberScope$constructors$1.invoke(LazyJavaClassMemberScope.kt:102)
	at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassMemberScope$constructors$1.invoke(LazyJavaClassMemberScope.kt:84)
	at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
	at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
	at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor.getConstructors(LazyJavaClassDescriptor.kt:146)
	at org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor.getConstructors(LazyJavaClassDescriptor.kt:45)
	at org.jetbrains.kotlin.serialization.DescriptorSerializer.classProto(DescriptorSerializer.kt:115)
	at org.jetbrains.kotlin.incremental.JavaClassesTrackerImplKt.convertToProto(JavaClassesTrackerImpl.kt:88)
	... 43 more


Kotlin in Action : 코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심

이 책은 좀 마음에 든다. 그래도 돈이 없어서 사진 않겠다.

개념설명과 예시가 잘 나와있고 번역도 걸리는거 없이 자연스럽게 읽힌다.
책의 수준은 자바를 어느정도 알아야 제대로 볼 수 있을 것 같다.
람다까지는 어느정도 할 줄 알아야…

본인쨩은 자바도 할 줄 알고 코틀린도 튜토리얼보면서 대강 익힌 후에 책을 봐서 좀 더 편하게 본것같기도 하다.

자바 특징

자바를 소개하는 책에는 자바가 간결하고 쉽다고 했지만… 그건 C,C++하던 사람들 얘기고
본인쨩은 C#을 먼저 하고 자바를 시작해서 그런지
처음에 자바 문법 극혐스러웠다. 

코틀린 써본 느낌

코틀린은 완성된 자바같다.
자바의 혐오스러운 부분을 배제해서 간결하고 직관적이다.

자바와의 호환성을 유지하기 위해 많은 부분을 희생한 것 같다.
자바코드 가져올 때 null타입 체크를 포기한거나 …
그런거나…또 뭐가 있더라
패키지 구조에서 인터널 스코프, sealed도 뭔가 문제가 있었던 것같은데, immutableCollection이 바이트코드에선 퍼블릭이라거나

몇 가지 문제 때문에 코틀린에서 만든 라이브러리를 자바에서 쓰면 좀 불편할 것 같다.

자바도 8에서 람다, 9에서 모듈을 적용하면서 열심히 따라오고는 있는데
자바19정도 되면 코틀린처럼 변하지 않을까

no-java kotlin 버전???

레거시 지원도 좋지만 가끔은 과감하게 포기하면서 발전 해 가면 좋겠다.

Kotlin DSL – BeanDefinitionDSL.kt

코틀린 DSL Bean 선언.

이거 공부 좀 하면 커스텀 빈도 만들 수 있지 않나

샘플코드
https://github.com/sdeleuze/spring-kotlin-functional
가이드 페이지
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way

한글 번역이나 어설프게 소스코드 붙여놓고 설명하면 더 헷갈릴 것 같다.

이해할 것도 없고 간단하니 그냥 소스 리포지터리 보는게 더 쉬움.

Kotlin에서 slf4j 로거 선언


SLF4J loggers in 3 ways from Kotlin


자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.


class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin

inline fun logger(): Logger {
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}

이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다

class MemberService {
companion object {
private val log = logger()
}
}

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨

private val log = logger()
class MemberService {
}

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?


interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}


abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}

Error: kotlin 뭔지 모를 reflection 오류

문제

SpringBoot + Kotlin을 실행시킬 때 다음과 같은 오류 발생

환경

해결

jackson_fastxml_version =2.9.6
jackson.version =2.9.6

spring boot에서 jackson이 2.8.x대르 가져오고 있었다. 변경.

아래 의존성이 제대로 설정되지 않은 경우 비슷한 오류 발생가능.
compile “org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version”
compile “org.jetbrains.kotlin:kotlin-reflect:$kotlin_version”

자바는 1시간이상 삽질했는데 제자리라면 의존성 오류.

코틀린Kotlin에서 자바 인터페이스 getter 처리

문제의 getter를 포함한 UserDetails 인터페이스

자바에서의 처리

코틀린Kotlin에서의 처리

1.

2.

3. 이게 제일 깔끔하고 알아보기 편하다.

상황에 따라 1,2번을 써야하는 경우가 있기는 할까

Kotlin 한 6개월 사용후기

문법적으로 기존 언어에 비해 많이 이질적이지 않고 받아들일만 했다.

구글에서 안드로이드 공식언어로 지정, 인텔리J의 젯브레인에서 개발, 스프링 진영에서도 지원된다고 하고…

별 문제가 없을 줄 알았는데… 이게 웬걸

  • JPA Entity 설계가 안되는건 아닌데 힘들었다.
    data class로 설계한다고도 하던데…. 기본값을 일일이 지정해줘야하는것도 불편하고… 이건 빠르게 포기하고 domain 모듈은 자바로 변경해서 작업해가지고 뭐가 더 안되는지도 모르겠다.
  • QueryDSL 안된다. 안됐었다. 지금은 모르겠다.
  • Validation. 힘들었지만 하긴했다. 다 되긴되더라
    @Field.NotNull
    val name:String
  • Annotation 넣을때.. 안되는건 아닌데 뭔가 괴상하다.
    이런형태에서 @Annotations(arrayOf(Annotation, Annotation))
    이것도 지원되기 시작 @Annotations([Annotation, Annotation])
  • Gradle kotlin 버전과 intellij plugin 버전이 안맞으면 아예 먹통이 된다.

이래저래 몇번 쓰다보니 익숙해지긴 했다.

위의 과정에서 제대로 된 해결책을 찾기가 힘들다는게 문제..

그리고 자꾸 변한다는것도 문제랄까… 좋아지니까 좋은건가

Error : Kotlin 플러그인 버전이 안 맞을 때 생기는 문제

Message

kotlin은 기본이 final이라서 @Cofiguration, @Bean 등의 스프링 설정파일을 사용할 때 오류가 발생한다.

plugin: kotliln-spring 을 사용하면 원래 괜찮아야 되는데….

그래들 라이브러리 버전을 몇 개 올려놨더니 문제가 발생한다.

 

여기저기 찾아봤는데 해결책이 잘 안보인다..annotation processing을 풀어놓으라는 말도 있고(안됨)

예전에 했던 프로젝트는 그냥잘 썼는데 갑자기?

변경한 부분이 spring을 5로 올리고 kotlin을 1.12.0에서 1.12.20으로 올렸는데

intellij plugin 버전은 1.12.1인것같아서 플러그인 업데이틀 해봤는데(안댐)

저번에도 어노테이션 쓸 때 arrayOf로 써야되는거랑 이런부분 바뀔 때 마다 오류나더니만…

꼬출린 진짜

해결하는데 시간이 한참 걸릴 것 같다.

실행된다.

플러그인과 의존성의 버전을 맞춰주자…..꼭

코틀린은 갈길이 멀다. 안정화되려면 2년은 있어야 하지 않을까

 

[소프트웨어] Kotlin+Java-SpringBoot 프로젝트 진행 후기

프로젝트라고 할 수준은 아니고 새로 만드는 마이크로 서비스에 꼬출린을 적용하다가 겪은 일들

사용기술 키워드

Java,Kotlin,SpringBoot,JPA,QueryDSL,RESTful API

문제상황

문법

TypeScript,Swift,Kotlin 문법이 상당히 비슷하다.

세개 언어의 합병은 불가능할까?

Reflection, Ananotation

JVM언어라 최종적으로 동일한 바이트코드가 나오는거니까 리플렉션도 동일한 형태로 나오겠지 생각했는데 아니었나보다.

리플렉션이 필요한 부분에서 오류가 나는 것 같다.

QueryDsl, jackson, Lombok(은좀다르지만)

 

생성자 선언

이건 좀 다른데.. 그냥 언어에 익숙하지 않아서 그런면도 있고

되게 편한것처럼 써있던데 막상 써보면

문법이 그리 편하지는 않다.

Lombok

Java와 혼용시 lombok 적용이 안된다.

컴파일타임 문제때문에…

같은 모듈에서 Java+Kotlin을 쓰는경우 오류가 난다.

해결방법은…(회피방법은?)

core<–web

core에 Java를 쓰고 web의 kotlin에서 가져다 쓰는건 가능하다.

근데 왜 쓰나?

그냥 한 번 써볼라고

그리고 아직 많이는 안 써봤찌만 쓰다보니 언어 자체가 조금 심플함이 좀 있다.