====== Kotlin with SpringFramework / JPA ======
* [[:springframework|Spring Framework]]
* [[java:jpa|JPA]]
===== all-open / kotling-spring compiler plugin =====
* https://kotlinlang.org/docs/all-open-plugin.html
* Spring 의 경우 ''all-open'' 말고, ''kotlin-spring'' 플러그인을 사용하는게 낫다.
* Kotlin 이 기본 ''final'' 클래스를 만드는 것을 특정 AOP 애노테이션(''@Transactiona'', ''@Component'' 등이 붙어있으면 ''open''으로 컴파일 시점에 변경해줌.
* [[:intellij_idea|IntelliJ IDEA]] **File -> Project Structure -> Project Settings -> Modules -> Kotlin -> Complier Plugins** 에서 적용된 컴파일러 플러그인 목록 확인가능.
===== no-arg / kotlin-jpa plugin =====
* JPA Entity나, 일부 프레임워크는 기본 생성자를 필수적으로 필요로 한다.
* [[https://kotlinlang.org/docs/no-arg-plugin.html|No-arg compiler plugin | Kotlin]]
* ''kotlin-jpa'' 플러그인은 ''no-arg'' 플러그인을 래핑해서 JPA Entity 애노테이션이 있는 클래스에 자동으로 기본 생성자를 생성해준다.
===== JPA 지연 로딩에 대해서 강제로 all open 지정 필요 =====
* JPA lazy loading 을 하려면 Entity가 ''final''이면 안됨. ''kotlin-spring'' 플러그인을 적용해도 자동으로 Entity에 all-open 이 적용이 안되고 있음. 명시적 지정필요.
// gradle
plugins {
kotlin("plugin.spring") version ".."
kotlin("plugin.jpa") version "..."
}
allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.MappedSuperclass")
}
===== QueryDSL =====
* [[https://kotlinlang.org/docs/kapt.html|Using kapt]] 로 적용 가능.
===== @Transient 는 getter 사용 =====
* JPA ''@Transient'' 에는 사용자 지정 getter 를 지정해야한다. 안그러면 초기화가 안된다.
// @Transient 불필요.
val fixed: Boolean
get() = startDate.until(endDate).years < 1
===== Field 초기화는 lateinit =====
* 필드 포기화가 필요할 경우에는 ''lateinit'' 을 사용하면 null safe 한 필드 주입이 가능하면서 지연 초기화가 가능하다.
* ''var'' 로 선언해야 함
@Autowired
private lateinit var objectMapper: ObjectMapper
''@Entity'', ''@Embeddable'', ''@MappedSuperclass'' 등.
===== Jackson =====
* [[java:jackson|Java Jackson JSON Library]]
* ''jacksonObjectMapper()'' 를 사용하면 Kotlin 모듈 자동 주입.
* ''ObjectMapper()''로 생성할거라면 ''registerKotlinModule()'' 호출 필요.
===== @ConfigurationProperties / @ConstructorBinding =====
* Immutable data class 에 대해 [[springframework:springboot|SpringBoot]] 2.2 부터 생성자 바인딩 지원
@ConfigurationProperties("...")
@ConstructorBinding
data class MyProperties(val url: String)
===== 참조 =====
* [[https://github.com/sdeleuze/spring-kotlin|Spring-Kotlin]]
* [[https://github.com/MarioAriasC/KotlinPrimavera|Kotlin Primavera]]
* [[https://github.com/spring-projects/spring-fu|Spring fu]] Explicit configuration for Spring Boot using Kotlin and Kofu DSL
* [[https://12bme.tistory.com/578|[kotlin] 스프링 프레임워크 개발]]
* [[https://cheese10yun.github.io/spring-kotlin/|Kotlin으로 Spring 개발할 때 - Yun Blog | 기술 블로그]]
* [[https://github.com/tmdgusya/kotlin-spring-jsr-303-issue|tmdgusya/kotlin-spring-jsr-303-issue]]