JPA 기본 pdf 중 '08. 프록시와 연관관계 관리' 내용 

 

-Member안에 team 객체가 있는 상황에서 member를 조회할 때 항상 team도 함께 조회해야할까?

굳이 그럴 필요없을 때 사용하는 것이 프록시(Proxy)이다 

 

-프록시 기초

em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회한다

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

 

 

-프록시 특징

실제 클래스를 상속 받아서 만들어진다

실제 클래스와 겉모양이 같다

사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용한다(이론상)

 

 

프록시 객체는 실제 객체의 참조(target)를 보관한다 

프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다

 

-프록시 객체의 초기화

 

-프록시 특징(중요!!)

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

 

2.프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능하다

jpa는 한 트랜잭션에서 같은 걸 보장해준다 

영속성 컨텍스트에 엔티티가 있으면 엔티티를 반환한다

 

3.프록시 객체는 원본 엔티티를 상속받는다. 따라서 타입 체크시 주의해야한다(==비교는 실패하기 때문에 instanceof를 사용해야한다)

 

4. 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다

 

5. 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생한다

(하이버네이트는 Org.hibernate.LazyInitializationException 예외를 터트린다. 실무에서 자주 마주칠 에러다)

 

-프록시 확인

1. 프록시 인스턴스의 초기화 여부 확인: PersistenceUnitUtil.isLoaded(Object Entity)

 

2.프록시 클래스 확인 방법: entity.getClass().getName()출력

(..javasis..or HibernateProxy)

 

3. 프록시 강제 초기화: org.hibernate.initialize(entity);

 

4.참고로 JPA 표준은 강제 초기화가 없다. 

강제 호출: member.getName()

+ Recent posts