Java + Spring Boot로 만들어진 웹 애플리케이션을 Kotlin + Spring Boot로 리팩토링 하고 추가 요구사항을 구현합니다. 이 과정에서 Junit5, SQL, JPA, Querydsl 을 사용할 뿐 아니라, 설계 및 구현 관점에서 다양한 방법의 장단점을 다루게 됩니다.
안녕하세요! Kotlin + JPA 를 함께 사용할 때 주의할 점을 추가적으로 공유드립니다!!
안녕하세요! Kotlin과 JPA를 함께 사용할 때 추가적으로 고려할 내용이 있어 말씀드립니다.
그 내용은 바로, build.gradle에 아래와 같은 스크립트를 추가해주셔야 한다는 점입니다!
plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "1.6.21"
}
// plugins, dependencies와 같은 Level (즉 build.gradle 최상단)
allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.MappedSuperclass")
annotation("javax.persistence.Embeddable")
}
그 이유는 다음과 같습니다!
아시다시피, Kotlin은 기본적으로 Class도 final, 함수도 final입니다!! (즉, 상속과 오버라이드를 막아두었습니다!)
하지만 JPA를 사용할 때 Proxy Lazy Fetching을 완전히 이용하려면 (27강에서 Lazy Fetching에 대한 이야기가 있습니다!) 클래스가 상속 가능해야 합니다!! 제가 확인해본 바로는 @OneToMany에 있어서는 Lazy Fetching이 동작하지만 @ManyToOne에 대해서는 Lazy Fetching 옵션을 명시적으로 주더라도 동작하지 않았습니다.
그래서 all-open 기능을 통해 @Entity 클래스들은 Decompile을 했을 때도 class가 열려 있게끔 처리해주어야 하고, 위의 스크립트가 바로 그런 역할을 수행하게 됩니다.
본 강의에서는 @ManyToOne Lazy Fetching을 사용하지 않다보니, 해당 plugin이 강의에서 언급되지 않았습니다. 다음부터는 조금 더 많은 내용을 놓치지 않고 꼼꼼하게 설계할 수 있도록 하겠습니다. 🙇실제 프로젝트서는 해당 plugin 설정을 꼭 해주시면 좋을 것 같습니다!! 감사합니다!! 🙏
(동일한 내용의 글은 <14강. Kotlin과 JPA를 함께 사용할 때 이야기거리 3가지>에도 업로드 되었습니다!)