Skip to content

Latest commit

 

History

History
24 lines (21 loc) · 1.53 KB

3.Proxy.md

File metadata and controls

24 lines (21 loc) · 1.53 KB

Proxy (Hibernate)

Proxy 기초 - em.find() vs em.getReference()

  • em.find(): DB를 통해서 실제 Entity 객체 조회
  • em.getReference(): DB 조회를 미루는 가짜(Proxy) Entity 객체 조회

Proxy의 특징

  • 실제 클래스를 상속 받아 만들어지고, 실제 클래스와 겉모양이 똑같음

타입 체크 시 == 비교 실패, instance of 사용

  • 사용하는 입장에서는 진짜 객체인지 Proxy 객체인지 구분하지 않고 사용하면 됨(이론상)

몇가지 조심해야할 점은 있음

  • 실제 객체의 참조(target)를 보관하고, Proxy 객체를 호출하면 Proxy 객체는 실제 객체의 메소드를 호출
  • Proxy 객체는 처음 사용할 때 딱 한번만 초기화되고, Proxy 객체를 초기화할 때 Proxy 객체가 실제 Entity로 바뀌는 것은 아님. 초기화되면 Proxy 객체를 통해 실제 Entity에 접근 가능
  • 영속성 컨텍스트에 찾는 Entity가 이미 있으면 em.findReference()를 호출해도 실제 Entity 반환 (반대도 마찬가지)
  • 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제 발생

org.hibernate.LazyInitializationException 예외 발생

Proxy 확인

  • Proxy Instance 초기화 여부 확인: emf.getPersistenceUnitUtil().isLoaded(Object entity)
  • Proxy 클래스 확인: entity.getClass().getName() 출력
  • Proxy 강제 초기화: org.hibernate.Hibernate.initialize(entity)

JPA 표준은 강제 초기화가 없음. (강제 호출을 해야함 -> member.getName())