PSD( Private-Self-Development )

JPA 의 프록시, 지연 로딩, 즉시 로딩 본문

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

 

'Backend > JPA' 카테고리의 다른 글

JPA 의 쿼리 작성 라이브러리  (0) 2022.10.20
JPA 값 타입  (0) 2022.10.14
JPA 의 상속  (0) 2022.10.11
JPA의 DB 매핑  (0) 2022.10.06
JPA의 영속성 컨텍스트  (0) 2022.10.06