인프런 커뮤니티 질문&답변

LPD Code님의 프로필 이미지
LPD Code

작성한 질문수

실전! 스프링 데이터 JPA

LazyLoading 시 가져오는 객체에 대해 질문이있습니다!

작성

·

328

0

[질문 내용]
안녕하세요 영한님 JPA 를 공부하다가 LazyLoading 관련해서 의문점이 생겨 질문남깁니다.
연관관계에서의 LazyLoading 은 실제 entity를 가져오는것이 아닌 프록시객체의 target이 entity와 연결되어있는것으로 알고있습니다.
그래서 Team(1) <-> Member(n) 의 관계라고 가정했을때 Member 에서의
@ManyToOne 관계에서의 LazyLoading 으로 객체를 가져오게 되면 Team은 `Team$HibernateProxy$95RMKfgq@13875` 이런 형식으로 프록시 객체를 갖고있는것을 확인했습니다.
다만 Team에서 @OneToMany 관계의 Member를 LazyLoading 호출하게되면
List<Member> 의 형식이 PersistentBag 의 객체형식을 가지고있는것까지는 이해했는데 컬렉션 내의 객체는 제가 생각했던
`Member$HibernateProxy$95RMKfgq@13875` 와 같은 프록시 객체의 형태가 아닌
`Member@13867` 과 같은 실제 객체를 가지고 있는것으로 확인했습니다.
이와 관련해서 PersistenceCollection 이나 StatefulPersistenceContext 클래스의 관련된 문서를 찾아봤지만
답을 찾지못해 여쭤봅니다ㅠㅜ
 
추가로 entityManagerFactory getPersistenceUnitUtil().isLoaded 메소드를 이용해서 List 객체를 조회했을땐
false 로 확인했습니다. 다만 디버그모드로 봤을때는 ManyToOne 과 다르게 실제객체형태로 보이네요ㅠㅜ
디버그모드로 확인시 값을조회해야해서 의도치않게 추가쿼리가 발생되는것은 인지하고있지만 이 케이스는 이해가 되질 않네요 ㅎㅎ
 

답변 2

6

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. LPD Code님

일대다 관계의 경우 PersistentBag이 지연로딩을 내부에서 처리해줍니다. 그리고 해당 컬렉션의 데이터를 조회하면 컬렉션 안의 데이터를 한번에 조회하는 것이지요. 그리고 컬렉션 안의 데이터는 지연로딩할 필요가 없기 때문에 실제 엔티티가 조회됩니다. (컬렉션 자체가 지연로딩의 기능을 대신해줍니다)

감사합니다.

0

삭제된 글입니다

혹시라도 제가 잘못된 정보를 작성하였다면 영한님이나 서포터분들께서 정정해주세요! 

LPD Code님의 프로필 이미지
LPD Code

작성한 질문수

질문하기