728x90

즉시로딩 

엔티티와 그와 연관된 엔티티들을 쿼리 할 때 한 번에 모두 가져오는 방식을 의미합니다. 한 개의 엔티티를 쿼리 할 때 이 엔티티와 연관된 다른 엔티티들도 즉시 로딩으로 설정되어 있다면, 해당 엔티티와 관계된 모든 데이터가 한 번에 가져옵니다. 이는 필요하지 않은 데이터까지 불러올 수 있어 성능에 영향을 줄 수 있습니다.

 

자바ORM 표준 JPA 프로그래밍

 

즉시 로딩 @ManyToOne, @OneToOne 과 같은 어노테이션에 fetch = FetchType.EAGER를 설정하여 구현할 수 있습니다.

@Entity
public class ParentEntity {
    @OneToMany(fetch = FetchType.EAGER)
    private List<ChildEntity> children;
}

 

프록시와 즉시로딩 주의

  • 지연로딩을 사용하는 것이 좋다. 데이터가 실제 필요한 시점에 가져와짐으로 성능을 최적화할 수 있습니다.
  • 즉시로딩은 JPQL에서 N+1문제를 유발할 수 있으며, 이는 여러 개의 엔티티를 가져올 때 추가적인 쿼리를 발생시켜 성능에 영향을 미칠 수 있습니다.
  • JPA에서 @ManyToOne과 @OneToOne은 기본적으로 즉시 로딩이며 이를 LAZY로 설정하여 프록시를 활용하여 필요한 시점에 데이터를 로딩하도록 하는 것이 좋습니다.
  • @OneToMany, @ManyToMany는 기본적으로 지연로딩이므로 연관된 데이터가 필요한 경우에만 로딩되어 성능을 개선할 수 있습니다.

지연로딩

@Entity
public class ParentEntity {
    @OneToMany(fetch = FetchType.LAZY)
    private List<ChildEntity> children;
}

 

데이터를 실제로 필요한 시점에 가져오는 전략이며 지연로딩은 데이터를 즉시 가져오는 즉시 로딩과 달리, 해당 데이터가 필요한 시점에 데이터베이스에서 가져와서 성능 향상을 이끌어 줍니다.

JPA에서 @ManyToOne,@OneToOne 관계는 즉시 로딩이 기본설정이지만 @OneToMany @ManyToMany관계는 지연로딩이 기본 설정입니다. 지연로딩은 프록시를 사용하여 실제 데이터를 요청할 때 가져오는 방식으로 동작하기 때문에 해당 엔티티를 사용하는 시점에서 데이터베이스에서 필요한 데이터를 쿼리 하게 됩니다. 이를 통해 애플리케이션 성능을 최적화하고 불필요한 데이터 로딩을 방지할 수 있습니다.

자바ORM 표준 JPA 프로그래밍

프록시와 지연로딩 주의

  • 지연로딩된 엔티티를 사용할 때 발생할 수 있는 주요 예외입니다. 영속성 컨텍스트를 벗어난 상태에서 지연 로딩된 엔티티를 접근하면 LazyInitializationException이 발생할 수 있습니다. 이를 피하기 위해 영속성 컨텍스트 내에서 데이터를 가져오거나 FetchType.EAGER로 설정하여 즉시 로딩할 수 있습니다.
  • 프록시 객체를 사용할 때 영속성 컨텍스트 내에서 관리되어야 합니다. 영속성 컨텍스트를 벗어나면 프록시 객체를 초기화할 수 없으며, 초기화를 시도할 경우 LazyInitializationException 이 발생할 수 있습니다.
728x90

'Spring(Boot & FrameWork)' 카테고리의 다른 글

Web Socket  (0) 2024.01.22
Proxy  (0) 2023.12.22
@OneToOne/ @ManyToMany  (0) 2023.12.21