본문으로 바로가기

Kotlin 에서 JPA 사용시 주의점

category Language/코틀린 2024. 1. 30. 14:00
728x90
반응형
SMALL

Hibernate의 Entity 필수 조건

  • 매개 변수 없는 생성자를 가져야함(`@NoArgsConstructor(access`)
    • Hibernate는 리플렉션을 통해 엔티티 클래스를 인스턴스화 하기 때문에 반드시 `기본 생성자`가 필요
  • `Lazy 로딩` 을 위해서 `필드` 또는 `클래스``final`이 되면 안된다
    • AOP 적용되지 않는 문제 발생
    @Service
    @Transactional(readOnly = true) // 적용 되지 않음
    class PostService(
    )
    • `지연로딩``프록시 객체`를 생성하지 못한다.
      • JPA에서 조회하려는 객체의 연관된 엔티티의 필드값을 `나중에 가져오고 싶을때` `불필요한 SQL 조회 쿼리`가 나가는것을 막기위해 원본 엔티티를 상속 받은 `프록시 객체`를 생성
      • 프록시 객체에는 ID만 존재해서 필드에 데이터가 없어도 먼저 조회가 가능한것이다.
      1. 프록시 객체 생성(ID값만 존재)
      2. 프록시에 존재하지 않는 필드 사용이 필효애지면 그때 조회쿼리 날림
      3. DB에서 가져온 값을 실제 엔티티에 세팅
      4. 프록시 엔티티는 실제 엔티티의 참조값을 갖고 있으므로 프록시 메서드 호출 시 실제 엔티티 호출
  • 코틀린은 모든 클래스는 `final` 이다. `final``상속이 불가`능하다. 이는 여러 문제를 야기한다.

 

해결법

  • 모든 클래스에 `open` 키워드 추가, no-arg 추가
plugins {
	//모든 클래스에 `open` 키워드 추가
  	id ("org.jetbrains.kotlin.plugin.allopen") version "1.8.22"
  	
  	//no-arg 생성자를 자동으로 만들어 주는 플러그인
  	id ("org.jetbrains.kotlin.plugin.noarg") version "1.8.22"
}
  • @Entity, @Embeddable 같은 JPA 어노테이션 들은 대상에서 제외되므로 아래 수동으로 추가
allOpen {
    annotation("jakarta.persistence.Entity")
    annotation("jakarta.persistence.Embeddable")
    annotation("jakarta.persistence.MappedSuperclass")
}

noArg {
    annotation("javax.persistence.Entity")
}
  • toString(), equals(), hashCode() 자동 적용
repositories {
    mavenCentral()
    maven("https://jitpack.io")
}


dependencies {
  implementation("com.github.consoleau:kassava:2.1.0")
}

코틀린에서는 `data 키워드`를 추가하면 `컴파일러`가 대신 `toString(), equals(), hashCode()`을 정의해주지만 `hibernate`를 사용할 경우 `entity`에 data 키워드는 여러 문제를 발생시키기 때문에 `kassava` 라이브러리로 대체한다.

Data class

  • 게터/세터
  • 기본 생성자
  • 기본 값을 설정해주어야 기본 생성자가 만들어진다.
data class LhNotice(
     val code: Long = "",
     val content: String = ""
)
  • equals, hashcode, toString

 

 

 

참고자료

https://shanepark.tistory.com/440

https://techblog.woowahan.com/2675/

https://velog.io/@semi-cloud/Kotlin-%EC%BD%94%ED%8B%80%EB%A6%B0%EA%B3%BC-JPA%EB%A5%BC-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD-%EB%AA%A8%EC%9D%8C

728x90
반응형
LIST