개발

JPA - @OneToOne LazyLoading, 프록시

플리트우드 2024. 12. 4. 16:15

1.

자바 ORM 표준 JPA 프로그래밍 - 220p : 프록시를 사용할 때 외래키를 직접 관리하지 않는 일대일 관계는 지연 로딩으로 설정해도 즉시로딩된다.

 

locker.member는 지연로딩할 수 있지만, member.locker는 지연로딩으로 설정해도 즉시로딩된다. locker가 외래키를 가지고 있는 테이블이니까~

 

2. 

연관관계의 주인이 아닌 애가 oneToOne에서 lazyLoading을 쓰려고 하면, 상대테이블의 키를 얘가 안 가지고 있으니 프록시를 못 가져와서 lazy로 해놔도 eager로 동작

출처 : https://1-7171771.tistory.com/143

 

[JPA] @OneToOne에서 Fetch 전략을 Lazy로 설정했을때 발생하는 이슈

Lazy Loading JPA의 유일한 단점은 사용하기 쉬운만큼 성능적인 측면에서 발생할 수 있는 이슈를 간과하기 쉽다는 것인데, 성능이 안나올때 가장 먼저 고려해봐야할 부분이 즉시로딩(EAGER LOADING)으로

1-7171771.tistory.com

 

 

3. 

JPA는 일반적으로 @OneToOne에 지연 로딩을 지원하지 않는다. 이유는 다음과 같다. JPA는 객체의 참조가 프록시 기반으로 동작한다.즉 연관 관계가 있는 객체는 참조 할때 기본적으로 Null이 아닌 객체를 반환한다. 1:1관계 에서는 Null이 허용되는 경우 프록시 형태로 Null 객체를 반환할 수 없기 때문이다.(= Nullable한 엔티티에 대해 프록시 객체 생성을 보장할 수 없다) 그런 이유로 JPA구현체는 1:1 관계에서 지연로딩을 허용하지 않고, 값을 즉시(Eager)읽어들인다.

출처 : https://velog.io/@yebali/Spring-OneToOne-관계와-지연로딩

 

Spring, @OneToOne 관계와 지연로딩

잘못된 설계에서 비롯된 문제이지만 기존 Java-Spring프로젝트를 Kotlin-String으로 이주하면서 @OneToOne 관계에서 지연 로딩기능이 동작하지 않는 문제가 생겼다.하여 오늘은 관련 내용을 공부했다이

velog.io

 

4.

일대다 지연로딩은 그럼 어케 되는거?

컬렉션 래퍼를 쓰기 때문에 지연로딩에 문제가 없다고 한다. member.orders에서 orders를 컬렉션 래퍼로 반환한다. 

일대다 관계는 이미 배열의 형태로 참조할 프록시객체를 감싸고 있어서, 그 객체가 Null이더라도 참조하는 데 문제가 없다.