본문 바로가기
JPA

JPA Lazy Loading

by Gil Granger 2019. 8. 6.

개발환경  : Hibernate 5.3.7 , Spring Data JPA 2.1.5

 

@ManyToOne, @OneToOne FetchType=LAZY로 설정시 전체 Entitiy를 entitiyManager.find 호출할때 프록시 객체(Hibernate Proxy)가 생성되며 대상필드를 접근할때(get호출) 데이터 조회한다.

이때 데이터베이스를 조회해 실제 엔티티를 생성하는 것을 프록시 객체의 초기화라고 한다.


실제 데이터를 얻기 위해 getName()을 호출했을시 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성하고, 해당 객체의 참조를 target 변수에 보관한다.
프록시 객체는 target 변수에 저장된 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.

1. Member member = em.find(Member.class, 1);  
2. Team team = member.getTeam(); // 프록시 객체
3. team.getName(); // sql 실행!

 

(디버깅할때는 2번라인에서 sql이 실행되는것으로 보이는대, 코드의 데이터를 preview(watch)하기 때문에 실행되는것으로 보인다.)

그리고 이때 엔티티의 식별자, 즉 getId를 호출할때는 sql를 실행하지 않는다. ex) team.getId()

 


@OneToMany 에 LAZY 로딩시 주로 컬렉션 클래스를 사용하므로 PersistentBag 클래스가 생성된다.
get하면 sql실행되며, 값들이 배정된다.

 

참고 : https://joont92.github.io/jpa/%ED%94%84%EB%A1%9D%EC%8B%9C%EC%99%80-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EA%B4%80%EB%A6%AC/

 

댓글