Proxy

  • 엔티티 조회할 때 무조건 연관 관계를 사용하는 것이 아니므로 필요할 때 호출하는 것이 최적일 수도 있다.
  • 이를 지연로딩이라고 한다. 사용 시점이 값을 DB에서 당겨온다.
  • 이 전까지는 프록시로 대체한다.
  • entityManager.getReference()로 proxy를 부를 수 있다.
  • 특징으로는
    1. 처음 사용할 때 한 번만 초기화된다.
    2. 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것이 아니다. 프록시를 통해서 실제에 접근할 수 ㅅ있다.
    3. 프록시는 엔티티를 상속받은 객체이므로 타입 체크시에 주의해야 한다.
    4. 영속성 컨텍스트에 찾는 엔티티가 있으면 데이터베이스를 조회할 필요가 없으므로 entityManager.getReference()는 실제 엔티티를 뱉는다.
    5. 초기화는 영속성 컨텍스트의 도움을 받아야 한다.
  • 프록시는 PersistenceUnitUtil.isLoaded(Object entity)로 초기화 여부를 확인할 수 있다.

즉시 로딩, 지연 로딩

  • 즉시 로딩 : 엔티티 조회할 때 연관 엔티티도 함께 조회
    • fetch 속성을 FetchType.EAGER로 변경
  • 지연 로딩: 연관된 엔티티를 실제 사용할 떄 조회한다.
    • fetch 속성을 FetchType.LAZY로 변경
  • optional, nullable 여부로 inner, outerJoin이 결정된다.

JPA 기본 fetch 전략

  • @ManyToOne, @OneToOne: EAGER
  • @OneToMany, @ManyToMany: LAZY