[JPA] 지연 로딩과 프록시의 활용

@Entity
public class Member {
    // ...
    
    // 지연 로딩 설정: Member 조회 시 Team은 프록시 객체로 설정
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    // ...
}
  • Member 엔티티 내에서의 Team 과의 관계가 지연 로딩으로 설정되어있음.
    • Member 조회시에 Team 은 프록시 객체로 채워짐.
// 지연 로딩을 사용하는 실행 코드 예시
public class SomeService {

    public void loadMember(EntityManager em) {
        // 회원만 조회하고, 팀은 프록시 객체로 채워짐
        Member member = em.find(Member.class, "member1");
        
        // 팀 객체에 실제로 접근하는 시점에 데이터베이스에서 로딩
        Team team = member.getTeam();
        String teamName = team.getName();
    }
}
  • team.getName() 을 호출시 DB에서 로딩하여 프록시 객체를 초기화
  • 이미 영속성 컨텍스트가 존재하는 엔티티는
    • 프록시 대신 실제 엔티티가 사용됨.

영속성 컨텍스트에서 존재하는 엔티티라는 동등성의 비교는 어떤식으로 하게될까?

  1. 동일성 비교 (Identity)
    • == 연산자는 객체의 참조를 비교한다.
    • 두 객체가 메모리 상에서 같은 주소를 가리키고 있는 확인
  1. 동등성 비교 (Equality)
    • equals()
      • 를 통해 두 객체의 내용이 같은지 비교하게된다.
  • 비교의 기준점은 보통
    • 일반적인 영속성 컨텍스트의 관점에서
      • 동일성 비교를 한다고 함
      • 같은 식별자를 가진 엔티티에 대해 == 비교시 true 가 나오게 된다.
      • 같은 식별자를 가진 엔티티가 이미 캐싱되어있다면
        • 그 캐시된 인스턴스를 반환
      • 같은 식별자를 가진 엔티티가 캐시에 없다면
        • DB로 부터 엔티티 로드후 캐시에 저장
      • 이후 같은 식별자로 요청이 들어오면, 저장된 캐시된 인스턴스 반환


Uploaded by N2T