-
[Kotlin] 코틀린에서 JPA Lazy Loading 적용하기프로그래밍 언어/Kotlin 2022. 9. 25. 21:00
실컷 열심히 API 를 작성하고 뿌듯해하며
테스트코드를 작성하여 실제 쿼리호출을 확인하였다.
??? 왜 쿼리가 예상한 것보다 더 나가지 ???
상황은 아래와 같았다.
A 엔티티 -> B 엔티티 (@OneToMany, Lazy Fetch)
A 엔티티 -> C 엔티티 (@OneToOne, Lazy Fetch)
A 엔티티 단독 조회
-> A,B,C 조회쿼리 발생
어디선가 getter 가 호출된 것인가...
아무리 찾아도 getter 가 호출된 흔적은 찾을 수 없었다.
그래서 구글링 결과 아래와 같은 포스팅을 만나게 되었다.코틀린에서 하이버네이트를 사용할 수 있을까? | 우아한형제들 기술블로그
{{item.name}} 신규 시스템을 개발하면서 코틀린과 하이버네이트를 함께 사용한 경험을 나누기 위해 작성해봅니다. 안녕하세요! 서비스플랫폼 팀에서 서버 개발을 하는 김지희, 김석홍입니다. 저희
techblog.woowahan.com
Hibernate 의 프록시 생성 특징 & 코틀린의 언어적 특성
Hibernate 는 프록시를 생성할 때, 상속받아 프록시 객체를 만들기 때문에
final 키워드로 상속을 막아버리면 프록시객체를 생성할 수 없다.
즉, 위와 같은 상황에서는 프록시객체를 생성하지 못해 바로 엔티티객체를 생성하게 되면서 Lazy Loading 이 동작하지 않는 것이다.
코틀린은 default 로 클래스와 프로퍼티, 메소드 모두 final 이며, open 키워드로 클래스를 열어주어도 프로퍼티, 메소드는 final 이다.
즉, 모든 프로퍼티, 메소드, 클래스에 open 키워드를 달아주어야 하는데 매우 귀찮은 작업이며 실수를 야기할 수도 있다.
따라서 아래의 플러그인을 사용하여 자동으로 클래스, 프로퍼티, 메소드에 open 키워드를 달아주는 것이 좋다.plugins { kotlin("plugin.allopen") kotlin("plugin.noarg") } allOpen { annotation("javax.persistence.Entity") annotation("javax.persistence.Embeddable") annotation("javax.persistence.MappedSuperclass") } noArg { annotation("javax.persistence.Entity") annotation("javax.persistence.Embeddable") annotation("javax.persistence.MappedSuperclass") }
트러블슈팅
혹여나 아래와 같은 문구를 만나게 된다면 아래 포스팅을 참조하자
The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown version[gradle.kts] The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown v
코틀린에서 플러그인을 선언하자 아래와 같은 에러문구를 만나게 되었다 The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown version Gradle..
developer-ping9.tistory.com
728x90'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[Kotlin] Runtime 에 타입정보를 알아내는 방법 (0) 2023.05.15 [Kotlin] 객체 데이터 암호화 하기 (0) 2023.05.08 [Kotlin] static nested Class, inner Class 문법 정리 (0) 2022.11.06 [Kotlin] 코틀린 문법 요약 (자바코드로 훑어보기) (0) 2022.09.19