[JPA] 프록시

SJ·2022년 12월 15일

JPA

목록 보기
8/12

Member를 조회할때 Team도 조회해야할까?


프록시 기초

  • em.find() vs em.getReference()

  • em.find(): 데이터베이스를 통해 실제 엔티티 객체 조회

  • em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회(DB에 쿼리가 안나감)

Member findMember = getReference(Member.class, member.getId()); 결과

  • Member 객체가 아니고 하이버네이트에서 만든 프록시 객체임을 알 수 있다.

프록시 특징

  • 프록시 객체는 실제 객체의 참조(target)을 보관
  • 프록시 객체 호출시 프록시 객체는 실제 객체의 메소드 호출

  • 프록시 객체는 처음 사용할 때 한번만 초기화

  • 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것이 아니고, 프록시 객체를 통해서 실제 엔티티에 접근 가능한 것이다.

  • 프록시 객체는 원본 엔티티를 상속받는다. 따라서 타입 체크시 == 비교 실패, instance of를 사용해야한다.

  • 영속성 컨텍스트에 찾는 엔티티 있을 경우 getReference()를 호출해도 실제 엔티티 반환한다.
    이와 반대로 처음에 getReference()로 프록시 객체를 호출 했을경우, em.find()를 해도 프록시 객체 반환한다.

프록시 확인

  • 프록시 인스턴스의 초기화 여부 확인
    PersistenceUnitUtil.isLoaded(Object entity)
  • 프록시 클래스 확인 방법
    entity.getClass().getName() 출력
  • 프록시 강제 초기화
    org.hibernate.Hibernate.initialize(entity);
profile
slowly But Surely

0개의 댓글