일단 kotlin에서 hibernate쓰는 방식이랑 java에서 hibernate 쓰는 방식이랑 다르다. 몇개의 설정이 필요함. 아래 링크에 kotlin으로 작성하는 jpa entity에 대한 설정을 어떻게 하면 좋을지 잘 나와있어서 나에게 필요한 부분을 정리해서 남겨놓으려고 한다.
kotlin-allopen
플러그인을 build path에 적용합니다. Hibernate에서는 final클래스를 사용하면 안 되기 때문에 해당 플러그인을 이용하여 자동으로 open 상태로 만들어 줍니다.plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "1.3.61"
}
allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.MappedSuperclass")
annotation("javax.persistence.Embeddable")
}
-> MappedSuperclass
와 Embeddable
에 대한 noArg 생성자가 필요없다면 넣지 않아도 될것같음.
Entity클래스를 data class로 작성하는 방법은 추천하지 않습니다. Hibernate는 자동 생성된
equals/hashcode
,toString
과 궁합이 좋지 않습니다.
코틀린을 JPA에 적용하면서 본 많은 예제들은 data class를 사용해서 Entity를 작성했습니다.
코틀린의 data class는 Lombok의 @Data 어노테이션처럼 많은 메소드들을 자동으로 생성해줍니다.
@Data
어노테이션이 만들어준 toString()
을 그대로 사용할 경우, 양방향 연관관계를 갖는 Entity들은 순환 참조 문제가 발생하면서 StackOverflow가 발생하는 것을 알고 계실 거라고 생각합니다.이러한 이슈는 이외에도 자동으로 작성된 equals와 hashcode 가 의도치 않은 상황을 야기할 수 있으므로 entity에는 data class의 사용은 지양하자는 것이 개인적인 의견입니다.