728x90

Proxy 란 ?

 

porxy 클래스란 실제 클래스를 상속 받아서 만든 실제 클래스와 겉모양이 똑같은 클래스 이다.

Client 입장에서는 진짜 객체인지 Proxy 객체인지 구분하지 않고 사용하면 된다는 특징이 있다.

 

Proxy 구조

 

Proxy 객체는 실제 객체애 대한 참조 (Ref) 를 보관한다. 그리고 Proxy  객체의 메소드를 호출 하면 Prxoy 객체는 실제

Method 를 호출한다.

 

 

Prxoy 객체 초기화

 

proxy 객체는 member.getName() 처럼 실제 값에 접근하려고 할때 데이터베이스를 조회해서 실제 엔티티 객체를 생성하는데 이것을 프록시 객체 초기화라 한다.

 

  • 프록시 객체에 member.getName() 을 호출해서 실제 데이터를 조회한다.
  • 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하는데 이것을 초기화라 한다.
  • 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다.
  • Proxy 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버 변수에 보관한다.
  • Proxy 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.

 

Prxoy의 특징

 

  • 프록시 객체는 처음 사용할 때 한 번만 초기화된다.
  • 프록시 객체를 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아니 다. 프록시 객체가 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근할 수 있다.
  • 프록시 객체는 원본 엔티티를 상속받은 객체이므로 타입 체크 시에 주의해서 사용해야 한다.
  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 데이터베이스를 조회할 필요 가 없으므로 em.getReference()를 호출해도 프록시가 아닌 실제 엔티티를 반 환한다.
  • 초기화는 영속성 컨텍스트의 도움을 받아야 가능하다. 따라서 영속성 컨텍스 트의 도움을 받을 수 없는 준영속 상태의 프록시를 초기화하면 문제가 발생 한다. 하이버네이트는 org.hibernate.LazyInitializationException 예외를 발생시 킨다.
728x90