웹개발/Jpa

Jpa - 프록시 및 로딩전략

slown 2024. 5. 29. 00:10

목차

1.프록시

2.로딩전략

 

1.프록시

JPA에서의 프록시는 엔티티의 지연 로딩(Lazy Loading)을 지원하기 위해 사용됩니다. JPA 구현체(예: Hibernate)는 엔티티 대신 프록시 객체를 반환하여 실제 데이터베이스 액세스를 지연할 수 있습니다. 프록시 객체는 실제 엔티티의 서브 클래스 또는 동적 프록시로서, 엔티티의 실제 데이터가 필요한 시점까지 데이터베이스 쿼리를 연기합니다.

 

프록시의 동작 원리

  • 지연 로딩 설정: 엔티티 관계(예: @OneToMany, @ManyToOne)에 fetch = FetchType.LAZY를 설정합니다.
  • 프록시 생성: JPA 구현체는 엔티티를 로드할 때 실제 엔티티 대신 프록시 객체를 반환합니다.
    초기화: 프록시 객체의 메서드가 호출되면, JPA 구현체는 실제 엔티티 데이터를 데이터베이스에서 로드하고, 프록시 객체를 초기화합니다.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
    // Getters and setters
}

 

위 예제에서 User 엔티티의 orders 컬렉션은 지연 로딩으로 설정되어 있습니다. User 엔티티를 로드할 때, orders 컬렉션은 프록시로 설정되고, 실제 Order 엔티티들이 필요할 때까지 데이터베이스 액세스가 지연됩니다.

2.로딩전략

로딩 전략은 엔티티 관계에서 데이터 로딩 방식을 결정하는 설정입니다. JPA는 두 가지 로딩 전략을 제공합니다: 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading).

1.즉시 로딩(Eager Loading)

즉시 로딩은 엔티티가 로드될 때 연관된 모든 데이터도 함께 로드되는 방식입니다. 이는 기본적으로 fetch = FetchType.EAGER로 설정됩니다.

장점: 데이터가 즉시 사용 가능하므로 추가적인 데이터베이스 쿼리가 필요 없습니다.
단점: 불필요한 데이터 로딩으로 인해 성능이 저하될 수 있습니다. 특히, 대규모 데이터셋의 경우 문제가 될 수 있습니다.

@Entity
@Getter
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    
    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER) 
    private List<Order> orders;  
}

2. 지연 로딩 (Lazy Loading)

지연 로딩은 실제로 데이터가 필요할 때까지 데이터베이스 액세스를 지연시키는 방식입니다. 이는 기본적으로 fetch = FetchType.LAZY로 설정됩니다.

장점: 초기 데이터 로딩 시 성능이 향상되고, 필요한 데이터만 로드하므로 메모리 사용량이 줄어듭니다.
단점: 데이터가 필요할 때마다 추가적인 데이터베이스 쿼리가 발생할 수 있습니다. 또한, 프록시 초기화 시점에 LazyInitializationException이 발생할 수 있습니다(예: 트랜잭션이 종료된 후에 지연 로딩된 데이터를 접근하려 할 때).

 

@Entity
@Getter
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) 
    private List<Order> orders;
}

로딩 전략 선택 기준

즉시 로딩: 엔티티를 로드할 때 연관된 데이터를 반드시 함께 사용해야 하는 경우.
지연 로딩: 연관된 데이터를 항상 사용하는 것이 아니라 필요한 경우에만 사용하는 경우. 대규모 데이터 로딩을 피하고 초기 로딩 성능을 향상시키려는 경우