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..

프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용

results matching ""

    No results matching ""