본문 바로가기
[JAVA]/JPA

JPA - 프록시(Proxy)

by 팡펑퐁 2023. 4. 17.
728x90

em.find()와 em.getReference()

em.find()

  • 데이터베이스에서 실제 엔티티 객체를 조회한다.

em.getReference()

  • 데이터베이스를 조회 곧장 하지 않고 미룬다. 대신 가짜(프록시) 엔티티 객체를 조회한다.

 

프록시 객체의 특징

  • 실제 클래스를 상속받아 만들어졌기 때문에 겉모양이 같다.
  • 타입 체크시에는 원본 엔티티를 상속받기 때문에 instance of를 사용해야 한다.
  • 사용하는 입장에서 진짜 객체인지 아닌지 구분하지 않고 사용할 수 있다.
  • 프록시 객체는 실제 객체의 참조를 보관한다.
  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출하는 방식으로 동작한다.
  • 프록시 객체를 처음 사용할 때 한 번만 초기화한다. 초기화할 때는 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다.
  • 영속성 컨텍스트에 찾는 엔티티가 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다.
  • 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때는 프록시를 초기화할 때 문제가 발생한다.

 

 

프록시 인스턴스의 초기화 여부를 확인하는 방법

  • PersistenceUnitUtil.isLoaded(Object entity)

 

프록시를 강제 초기화하는 방법

  • org.hibernate.Hibernate.initialize(entity);
    • jpa 표준은 강제 초기화가 없다.
    • 강제 호출 방법은 getter를 이용하는 것이 일반적이다. ex) member.getName() 등

 

 

 

참고

김영한 - 자바 ORM 표준 JPA 프로그래밍

728x90