프록시는 실제 클래스를 상속 받아서 만들어 진다
실제 클래스와 겉 모양이 같다
프록시 객체는 실제 객체의 참조(target)를 보관한다.
프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출
Member -> Team 있다고 가정해보면 Team 클래스를 부를 떄까지는 프록시(가짜객체)가 나온다
하지만 team의 데이터를 직접건드리는 순간 진짜 데이터객체가 target에 진짜 객체를 연결해준다
target 은 처음에는 null이다(프록시)
• 프록시 객체는 처음 사용할 때 한 번만 초기화
• 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초
기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능
• 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야함 (== 비
교 실패, 대신 instance of 사용)
• 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해
도 실제 엔티티 반환( 진짜 데이터 영속성 컨텍스트에 넣어놨는데 굳이 프록시 가져올필요 없다)
-> 프록시 호출하면 FIND해도 프록시가 나온다
• JPA에서는 A == A 이다 (진짜 데이터 ==프록시)
->한 영속성 컨텍스트에서 가져오고 PK가 같으면 항상 TRUE
• 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면
문제 발생 (= 영속성 컨텍스트를 날려버리면 DB에서 데이터를 가져올수 없기 때문)
(하이버네이트는 org.hibernate.LazyInitializationException 예외를 터트림)