프록시 기초
em.find() VS em.getReference()
- em.find() : 데이터베이스를 통해서 실제 엔티티 객체를 조회
- em.getReference() : 데이터베이스 조회를 미루는 가짜 (프록시, 껍데기) 엔티티 객체 조회
프록시 특징
- 실제 클래스를 상속받아서 만들어진다.
- 실제 클래스와 겉 모양이 같다.
- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지않고 사용하면된다. (이론상)
- 프록시 객체는 처음 사용할때 한 번만 초기화
- 프록시 객체를 초기화 할때 프록시 객체가 실제 엔티티로 바뀌는것은 아님, !! 초기화가 되면 프록시 객체를 통해서 실제 엔티티에 접근이 가능한것이다.
- 프록시 객체는, 원본 엔티티를 상속받는다, 따라서 타입 체크시 주의해야한다. (== 비교대신, instance of 사용)
- 영속성 컨텍스트의 도움을 받을수 없는 준영속 상태일때 (em.detach(), em.close()), 프록시를 초기화 하면 문제 발생 (!! 실무에서 많이만날수있는 케이스)
- 프록시 객체는 실제 객체의 참조 (target)을 보관한다.
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드 호출
- 예 ) getName()호출 --> target에 있는, getName()을 호출한다.