KOTLIN

코틀린에서 Data클래스에 JPA를 사용할 때 주의해야 할 점

dodop 2022. 11. 27. 14:27

 

 

코틀린의 data 클래스를 JPA와 함께 사용하려던 도중 몇가지 문제가 발생하여 알아보았다.

 

 

 

기본생성자

코틀린에서 data타입을 이용한 객체를 구현하여 JPA를 사용할 때 기본생성자를 작성해주어야한다.

이전 자바 공부할 때 배웠듯이 JPA의 경우 reflection을 이용해서 구현되기 때문에 기본생성자가 필수이다.

@Entity
data class Restaurant(
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Long? = null,
    @Column(unique = true, nullable = false)
    var name: String
) {

	constructor() : this(null, "")

}

 

 

하지만 매번 기본생성자를 생성하기 위한 작업은 매우 귀찮은데, 다음과 같이 plugin을 추가해줌으로서 생략할 수 있다!

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

 

 

 

data 클래스의 지연로딩

코틀린의 모든 클래스는 final이기 때문에 상속이 불가능하여 open으로 열어주어야 한다. 하지만 data 클래스는 open이 불가능하기 때문에 JPA를 이용하여 연관관계의 데이터를 조회할때 즉시 로딩이 되어 모든 데이터를 다 불러오게된다. 이때, 플러그인을 이용하면 data클래스를 확장하도록 설정할 수 있다.

buildscript {
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
  }
}

apply plugin: "kotlin-allopen"

allOpen {
  annotation "javax.persistence.Entity"
}

 

 

 

 

 

(참고한 사이트)

 

https://blog.sapzil.org/2017/11/02/kotlin-jpa-pitfalls/

 

Kotlin에서 JPA 사용할 때 주의할 점 | The Sapzil

Kotlin에서 JPA를 사용해봅시다! Java에서 쓸 때와 별로 다를 것은 없습니다. 하지만 엔티티 클래스를 데이터 클래스로 선언하였을 때 런타임 프록시 객체를 사용하는 Hibernate/JPA의 기능들이 잘 작동

blog.sapzil.org