[Kotlin] JPA 적용을 위한 noarg, allOpen

Jae Eon·2021년 9월 17일
0

Kotlin 공부

목록 보기
1/6
post-thumbnail

Kotlin으로 개발 중 ModelMapper를 사용하였고
ModelMapper를 이용한 Entitiy <-> data class 교환에서 기본생성자 초기화 문제를 마주치게 되었다.
이에 관해 공부하다 ModelMapper와 Hibernate의 Reflection API를 사용하기 위한 noarg,allOpen 컴파일러를 정리한 포스트.

🍋 JPA의 Hibernate가 지원하는 기능

  • Lazy loading : 엔티티 클래스는 final일 수 있지만, lazy loading을 위한 프록시 객체를 생성할 수 없다.
    final이면 프록시 객체를 생성할 수 없다. Hibernate-Entitiy 공식문서

    하지만 Kotlin 에서는 클래스와 프로퍼티, 함수가 기본적으로 final이며 따라서 상속이 불가능 합니다.
    이를 해결하기 위해 open 키워드를 사용해 final을 해제 해 줘야하고, 상속을 허용하는 프로퍼티와 함수에도 open 키워드를 추가로 붙여 줘야 합니다.


🍊 Hibernate의 Reflection API

  • Hibernate에서는 Reflection API를 사용한다.
    Reflection API를 통해 엔터티를 만들기 위해서는 인자가 없는 ※기본 생성자가 필요

🍓 NoArg 플러그인이 하는 일

  • @Entity, @Embeddable, @MappedSuperClass 어노테이션이 붙은 클래스에 자동으로 기본 생성자를 만들어줌
  • 덕분에 Hibernate의 Reflection을 사용 할 수 있게된다.
plugins {
 	kotlin("plugin.noarg") version kotlinVersion
 }

or

plugins {
  id "org.jetbrains.kotlin.plugin.noarg" version "1.5.30"
}

사용


🍑 AllOpen 플러그인이 하는 일

  • allopen 플러그인은 자동으로 모든 클래스(프로퍼티, 함수까지)를 open 시켜줍니다.
  • 매번 클래스와 프로퍼티에 open 키워드를 넣는 반복작업을 해결 해줌

🍎 결론

  • Hibernate에서 엔터티 클래스는 final일 수 있지만 lazy loading을 위한 프록시 생성불가
  • 코틀린의 모든 클래스는 final 이며, 상속을 위해서 명시적으로 open을 붙여야함
  • allOpen, noArg 플러그 사용해반복 작업은 플러그인을 사용해 편하게 할 수 있음
profile
🖋정리를 안하면 잊어버린다.👣한 발자국씩 가보자!

0개의 댓글