Kotlin으로 개발 중 ModelMapper를 사용하였고
ModelMapper를 이용한 Entitiy <-> data class 교환에서 기본생성자 초기화 문제를 마주치게 되었다.
이에 관해 공부하다 ModelMapper와 Hibernate의 Reflection API를 사용하기 위한 noarg,allOpen 컴파일러를 정리한 포스트.
Lazy loading : 엔티티 클래스는 final일 수 있지만, lazy loading을 위한 프록시 객체를 생성할 수 없다.
즉 final
이면 프록시 객체를 생성할 수 없다. Hibernate-Entitiy 공식문서
하지만 Kotlin 에서는 클래스와 프로퍼티, 함수가 기본적으로 final
이며 따라서 상속이 불가능 합니다.
이를 해결하기 위해 open
키워드를 사용해 final
을 해제 해 줘야하고, 상속을 허용하는 프로퍼티와 함수에도 open
키워드를 추가로 붙여 줘야 합니다.
※기본 생성자
가 필요@Entity
, @Embeddable
, @MappedSuperClass
어노테이션이 붙은 클래스에 자동으로 기본 생성자를 만들어줌plugins {
kotlin("plugin.noarg") version kotlinVersion
}
or
plugins {
id "org.jetbrains.kotlin.plugin.noarg" version "1.5.30"
}
사용
open
키워드를 넣는 반복작업을 해결 해줌