프록시 기초
- 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
Author And Source
이 문제에 관하여(프록시 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yuus95/프록시-기초저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)