8.1 프록시
엔티티를 조회할 때 연관된 엔티티가 항상 사용되는 것은 아님.
◉ 회원과 팀 정보를 출력하는 비지니스 로직
public void printUserAndTeam(String memberId) {
Member member = em.find(Member.class, memberId);
Team team = member.getTeam();
System.out.println("회원 이름 : " + member.getUserName());
System.out.println("소속팀 : " + team.getName());
}
◉ 회원 정보만 출력하는 비지니스 로직
public String printUser(String memberId) {
Member member = em.find(Member.class, memberId);
System.out.println("회원 이름 : " + member.getUserName());
}
회원 정보만 사용하는 곳에서 연관된 팀 엔티티까지 데이타베이스에서 조회해 두는 것은 효율적이지 않다.
JPA는 엔티티가 실제 사용될 때까지 데이타베이스 조회를 지연하는 방법을 제공.
지연 로딩이라고 한다.
◉ 프록시 객체
지연 로딩을 사용하기 위해서는 "가짜 객체"가 필요.
// 엔티티 직접 조회 - 영속성 컨텍스트에 없으면 DB 조회
Member member = em.find(Member.class, 100L);
// 엔티티를 실제 사용하는 시점까지 미루는 프록시 객체
Member member = em.getReference(Member.class, 100L);
프록시 객체의 특징
- 처음 사용할 때 한번만 초기화.
- 프록시 객체가 초기화 되면 프록시 객체를 통해 실제 엔티티에 접근 가능.
- 원본 엔티티를 상속받은 객체, 타입 체크 주의.
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 프록시가 아닌 실제 엔티티를 반환.
프록시 확인
클래스명 출력 : 클래스명 뒤에
...javasist..
프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용