Backend/JPA
JPA 의 프록시, 지연 로딩, 즉시 로딩
chjysm
2022. 10. 12. 14:15
프록시(Proxy)란?
"대리"를 의미한다.
JPA에서는 엔티티 조회 시, em.find() 가 아닌 em.getReference()로 지연 조회 시
조회 결과 값으로 이 가짜( 프록시 )를 조회해 온 후
이후 실 사용 시 조회 및 실 엔티티에 프록시 엔티티를 연결하는 역할로 사용된다.
프록시 특징
- 프록시는 첫 사용 시 한번만 초기화 된다.
- 초기화 시 프록시가 실 엔티티로 변경 되지는 않는다.
- 따라서 타입 체크 시 == 비교가 아닌 instance of 로 비교 해야한다.
- 영속성 컨텍스트에 해당 엔티티가 이미 있다면
getReference 시 실제 엔티티가 반환된다. - 영속성 컨텍스트 에서 제거 된 경우, 프록시 초기화 시도 시 에러 발생
프록시 상태 확인 함수
프록시 초기화 여부 확인
emf.getPersistanceUnitUtil().isLoaded( entity );
프록시 강제 초기화( JPA 표준은 아니다. )
org.hibernate.Hibernate.initialize( entity );
지연 로딩
연관 관계의 엔티티 조회를 프록시로 되게 끔 하는 것
@ManyToOne( fetch = FetchType.LAZY ) // 지연 로딩 설정
@JoinColumn( name = "TEAM_ID" )
private Team team;
team 의 무엇인가를 실제 사용하는 시점에 조회
즉시 로딩
연관 관계의 엔티티 조회되도록 하는 것
@ManyToOne( fetch = FetchType.EAGER ) // 즉시 로딩 설정
@JoinColumn( name = "TEAM_ID" )
private Team team;
팁!
- 가급적 지연 로딩을 사용하자.
- 즉시 로딩 사용 시 예상치 못한 sql 이 발생
- 즉시 로딩은 JPQL 에서 N + 1 문제를 일으킨다.
- @ManyToOne, @OneToOne 은 기본이 즉시 로딩이기 때문에
LAZY 설정을 해주자 - @OneToMany, @ManyToMany 은 기본이 지연 로딩
참조 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com