본문 바로가기
JPA with 김영한

프록시(Proxy)

by wonseok99 2021. 9. 9.

프록시 조회

엔티티의 조회  //  em.find(XXX.class, "id");
프록시 조회     //  em.getReference(XXX.class, "id");

 

 

프록시 객체의 초기화

  1. getReference 를 통해 특정 객체의 프록시를 호출한다.
  2. 프록시 객체의 참조(Target Id) 가 비어있기 때문에 영속성 컨텍스트에 초기화 요청을 한다.
  3. 실제 DB 에서 특정 객체 DB를 조회하여 실제 엔티티를 생성한다.
  4. 프록시 객체의 참조(Target Id) 와 실제 엔티티를 연결한다.

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

이 때, 프록시 객체의 메소드를 호출하면 참조에 연결된 특정 객체의 메소드를 반환한다.

 

 

프록시의 특징

  1. 프록시 객체는 실제 객체의 참조(Target Id)를 보관한다. 따라서 프록시를 호출하게 되면 참조를 통해 실제
    객채의 메소드를 호출하게 된다.

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

  3. 프록시 객체는 원본 엔티티를 상속받기때문에 타입 체크시 유의해야 한다. ( instance of 비교를 사용 )

  4. 영속성 컨텍스트에 찾으려는 엔티티가 이미 있을 경우..

    em.getReference()를 호출해도 프록시가 아닌 실제 엔티티를 반환한다. [ 반대도 마찬가지 ]
    영속성 컨텍스트에 엔티티가 존재하는데, 굳이 프록시를 반환할 이유가 없음

  5. 준영속 상태 [ 영속성 컨텍스트의 도움을 받을 수 없다 ] 일 때, 프록시를 초기화 하게되면 문제가 발생한다.
    영속성 컨텍스트에서 프록시 객체를 특정할 수 없기 때문

'JPA with 김영한' 카테고리의 다른 글

영속성 전이와 고아객체  (0) 2021.09.13
즉시로딩 과 지연로딩  (0) 2021.09.10
상속관계의 매핑  (0) 2021.09.08
다양한 연관관계 매핑  (0) 2021.09.05
연관관계 매핑  (0) 2021.09.04