문제상황

Untitled

Untitled

→ 위와 같은 코드에서 Member만 쿼리할지? Team도 함께 쿼리할지의 문제

  1. printMember()
  2. printMemberAndTeam

⇒ JPA는 지연로딩과 프록시를 통해 이를 해결


em.find() vs em.getReference()

Untitled

  1. em.find() : 데이터베이스에서 실제 엔티티 객체를 조회
  2. em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회. 즉 DB쿼리 없이 객체를 조회한다.
  3. Proxy객체 내부의 target이 실제 클래스를 참조한다.

Untitled

→ 이 경우 select 쿼리가 DB로 날아가지 않는다.

Untitled

→ select 쿼리를 호출

즉, getReference()는 객체의 값이 호출되는 시점에 쿼리를 수행하게 된다.


프록시 특징

Untitled

  1. 실제 클래스를 상속받아 만들어진다.

  2. 실제 클래스와 구조가 같다. 하이버네이트에 의해 내부적으로 Proxy객체를 생성

  3. 사용하는 입장에서는 진짜 객체인지, 프록시 객체인지 구분하지 않고 사용할 수 있다.

    → 상속해도 부모타입을 쓸 수 있으므로

  4. 프록시 객체는 실제 객체를 target으로 참조

  5. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.