-
코틀린에서 Data클래스에 JPA를 사용할 때 주의해야 할 점KOTLIN 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
'KOTLIN' 카테고리의 다른 글
Enum의 property로 Json 변환 대상 특정하기 (0) 2023.11.01 코틀린에서 테스트 하기 (⏳) (0) 2022.11.27 📕 코틀린 동시성 프로그래밍 - Ch.2) Coroutine in Action (0) 2022.11.11 📕 코틀린 동시성 프로그래밍 - Ch.1) Hello, Concurrent World! (0) 2022.11.08 코프링(코틀린 + 스프링부트) + 구글 스프레드 시트로 슬랙봇 만들기 - ④ 구글 스프레드 시트 사용하기 (0) 2022.10.22