all-open
말고, kotlin-spring
플러그인을 사용하는게 낫다.final
클래스를 만드는 것을 특정 AOP 애노테이션(@Transactiona
, @Component
등이 붙어있으면 open
으로 컴파일 시점에 변경해줌.kotlin-jpa
플러그인은 no-arg
플러그인을 래핑해서 JPA 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") }
@Transient
에는 사용자 지정 getter 를 지정해야한다. 안그러면 초기화가 안된다.// @Transient 불필요. val fixed: Boolean get() = startDate.until(endDate).years < 1
lateinit
을 사용하면 null safe 한 필드 주입이 가능하면서 지연 초기화가 가능하다.var
로 선언해야 함@Autowired private lateinit var objectMapper: ObjectMapper
@Entity
, @Embeddable
, @MappedSuperclass
등.
jacksonObjectMapper()
를 사용하면 Kotlin 모듈 자동 주입.ObjectMapper()
로 생성할거라면 registerKotlinModule()
호출 필요.@ConfigurationProperties("...") @ConstructorBinding data class MyProperties(val url: String)