프록시와 연관관계 관리 | 프록시

호떡·2023년 1월 24일
0

📝 github. jpabasic3


Member를 조회할 때 Team도 함께 조회해야 할까?

로직에 따라 필요한 정보가 다르므로 Member를 조회하면서 Team을 항상 함께 조회할 필요가 없다. 비지니스 로직에 따라 Member에 대한 정보만 필요하기도 하고, Member를 조회하면서 Team에 대한 정보도 필요할 때가 있기 때문이다. 따라서 Jpa에서는 프록시와 지연로딩을 통해 지원한다.


프록시 기초 | em.getReference( )

em.find( )

  • 데이터베이스를 통해서 실제 엔티티 객체 조회
  • 실제로 DB에 쿼리가 전달

em.getReference( )

  • 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
  • 실제론 DB에 쿼리가 전달되지 않지만, 객체가 조회됨
Member referenceMember = em.getReference(Member.class, member.getId());
System.out.println("referenceMember.id = " + referenceMember.getId());
// 이때까지 쿼리문 나가지 않음
// id 값은 em.getReference()에서 이미 사용되었으므로 그때 저장된 값을 가져올 수 있음. 
// 따라서 쿼리문 나가지 않음
System.out.println("referenceMember.username = " + referenceMember.getUsername());
// username은 DB에 있음. referenceMember(가짜)에는 데이터 없음
// 따라서 이때 쿼리문을 날려서 username 데이터를 가져옴

프록시 특징

  • 실제 클래스를 상속 받아서 만들어진다.
  • 실제 클래스와 겉모양이 같다.
  • 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. (이론상)
  • 프록시 객체는 실제 객체의 참조(target)를 보관
  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출
  • 프록시 객체는 처음 사용할 때 한번만 초기화
  • 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능한 것!⭐
  • 프록시 객체는 원본 엔티티를 상속 받는다. 따라서 타입 체크 시 == 비교가 아닌, instanceof 를 사용해야 한다.
  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면, em.getReference()를 호출해도 실제 엔티티를 반환한다.
  • 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제 발생

0개의 댓글