카테고리 없음

스프링 JPA 지연, 즉시로딩, Proxy

study5024 2025. 5. 1. 20:15
Tutor proxyTutor = em.getReference(Tutor.class, tutor.getId());

Proxy

JPA에서 엔티티 객체의 지연 로딩(Lazy Loading)을 지원하기 위해 사용하는 대리 객체로 실제 엔티티 객체를 생성하거나 데이터베이스에서 값을 읽어오지 않고도 엔티티의 참조를 사용할 수 있다.

 

Entity 조회

em.getReference()는 JPA의 EntityManager에서 제공하는 메서드로 특정 엔티티의 프록시 객체를 반환한다. 지연 로딩(Lazy Loading)을 활용해 데이터베이스 조회를 미루고 실제로 엔티티의 속성에 접근할 때만 데이터베이스를 조회하도록 한다.

 

em.find() vs em.getReference()

 

Tutor proxyTutor = em.getReference(Tutor.class, tutor.getId());

 

데이터베이스에 저장된 Entity가 아닌 가짜 Entity 객체를 조회한다.

 

 

System.out.println("proxyTutor.getName() = " + proxyTutor.getName());



지연 로딩(Lazy Loading)은 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식

 

  • JPA의 지연로딩
    • fetch 속성 사용
      • FetchType.LAZY : 지연로딩
    • 지연로딩을 사용하면 Proxy 객체를 조회한다.
    • 연관된 객체(Company)를 매번 함께 조회하는것은 낭비인 경우에 사용한다.

즉시 로딩(Eager Loading)은 엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식

    • JPA의 즉시 로딩
      • fetch 속성 사용
        • FetchType.EAGER : 즉시 로딩
      • Proxy 객체를 조회하지 않고 한 번에 연관된 객체까지 조회한다.
      • 연관된 객체(Company)를 매번 함께 조회하는것이 효율적인 경우에 사용한다.

 

  • 데이터베이스 조회를 지연하는 가짜(Proxy) 객체를 조회한다.
    • 실제 Entity와 == 비교 실패, instanceof 사용
  • target : 진짜 객체의 참조를 보관한다.