프록시 기초

  • em.find() : 데이터 베이스를 통해서 실제 엔티티 객체 조회
  • em.getReference(): 데이터베이스 조회를 미루는 가짜 엔티티 객체 조회 (프록시)

프록시 특징

  • 실제 클래스를 상속 받아서 만들어짐

  • 실제 클래스와 겉 모양이 같다.

  • 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상)
    --> 프록시는 Entity를 상속하는데 이 부분은 hibernater가 알아서해줌

  • 프록시 객체는 실제 객체의 참조를 보관

  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출

// 멤버내에 팀이 있을경우

findmember.getReference(); //프록시
findmember.getTeam(); -- > 프록시 객체를 호출하면 실제 객체의 메소드를 호출한다. 
// 프록시 객체를 초기화 요청 한 경우 △

  • 프록시 객체는 처음 사용할 때 한 번만 초기화 --> 그후엔 초기화안하고 계속 사용가능
  • 프록시 객체를 초기화 할 떄, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근 가능

-프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야한다. ( == 사용 xx - > instance of 사용하기)


Member member1 = new Member();
member1.setName("1번");
em.persist(member1);

Member member2 = new Member();
member2.setName("2번");
em.persist(member2);

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

Member findMember = em.find(Member.class, member1.getId());
Member refMember = em.getReference(Member.class, member2.getId());

System.out.println("findMember == refMember"+ (findMember == refMember));
  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환 (반대의 경우도 똑같이 적용 프록시 먼저할 경우 find도 프록시를 호출)
            Member findMember = em.find(Member.class, member1.getId());
            Member refMember = em.getReference(Member.class, member1.getId());
            System.out.println("member1 == > findMember.getClass==> " + findMember.getClass());
            System.out.println("member1 == > refMember.getClass==> " + refMember.getClass());
//class hello.jpa.Member 둘다 클래스로나옴

//======================================================================

            Member refMember = em.getReference(Member.class, member1.getId());
            Member findMember = em.find(Member.class, member1.getId());
            System.out.println("member1 == > findMember.getClass==> " + findMember.getClass());
            System.out.println("member1 == > refMember.getClass==> " + refMember.getClass());



//class hello.jpa.Member$HibernateProxy$KuygTIr9

좋은 웹페이지 즐겨찾기