시냅스

JPA 프록시 관련 정리 본문

Java, Spring/JPA

JPA 프록시 관련 정리

ted k 2022. 9. 17. 14:06

프록시

  • em.find()
    • 데이터베이스를 통해서 실제 엔티티 객체 조회
  • em.getReference()
    • 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
      • 데이터베이스에 조회가 필요할 때 필요한 시점에 조회한다.
    • 데이터베이스에 쿼리가 실행이 되지 않았음에도 조회가 되는 것
  • 프록시는 실제 클래스를 상속 받아 만들어져 겉 모양이 같다.
  • 클라이언트는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨
  • 프록시 객체는 처음 사용할 때 한 번만 초기화한다.
  • 프록시 객체를 초기화 할 때 프록시 객체가 실제 엔티티로 바뀌는 것은 아니고, 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근 가능하다.
  • 프록시 객체는 원본 엔티티를 상속 받는다, 따라서 타입 체크시 주의해야함
  • 프록시 내부에는 실제 객체의 참조를 보관한다.
  • 프록시 객체를 호출하면 프록시 객체는 객체의 메소드를 호출한다.
  • 만약 proxy에 값이 없으면 영속성 컨텍스트에 요청해서 db에서 값 받아오고, 실제 entity생성하고, proxy에서 실제객체.getName() 과 같은 꼴로 호출함
    • 만약 1차 캐시 찾을 수 있는 값이라면 1차 캐시에서 가져온다.

 

  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 Em.getReference() 를 호출해도 실제 엔티티가 반환된다.
Member member1 = new Member();
member1.setUserName("hello");
em.persist(member1);

em.flush();
em.clear();

Member m1 = em.find(Member.class, member1.getId());
System.out.println("m1.getClass() = " + m1.getClass()); // 실제 객체

Member reference = em.getReference(Member.class, member1.getId());
System.out.println("reference.getClass() = " + reference.getClass()); // 실제 객체, 같은 영속성 컨텍스트에서 가져 옴

System.out.println("a == a: " + (m1 == reference)); // true

 

  • 영속성 컨텐스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생된다
Member member1 = new Member();
member1.setUserName("hello");
em.persist(member1);

em.flush();
em.clear();

Member refMember = em.getReference(Member.class, member1.getId());
System.out.println("refMember = " + refMember.getClass()); // proxy

em.clear(); // 영속성 컨텍스트에서 연결 끊음

System.out.println("refMember.getUserName() = " + refMember.getUserName());
// 영속성 컨텐스트에서 유지 하지 않기 때문에 찾을 수 없음

 

  • 프록시 인스턴스의 초기화 여부 확인
    • PersistenceUnitUtils.isLoaded(Object entity)
  • 프록시 클래스 확인 방법
    • entity.getClass().getName()

'Java, Spring > JPA' 카테고리의 다른 글

JPA 값 타입 관련 정리  (0) 2022.09.17
JPA 즉시 로딩과 지연 로딩, 영속성 전이와 고아 객체  (0) 2022.09.17
JPA MappedSuperclass 정리  (0) 2022.09.17
JPA 상속관계 매핑 정리  (0) 2022.09.17
JPA 연관관계 정리  (0) 2022.09.16
Comments