반응형

지연로딩(Lazy Loading)

- 객체가 실제로 사용될 때까지 데이터베이스에서 데이터를 가져오지 않고, 필요한 순간에 데이터를 가져오는 방식

- 객체 그래프를 따라가면서 데이터를 가져올 때 사용

- 객체 그래프가 복잡하고, 많은 데이터를 가져와야 할 때 사용하면 성능을 향상시킬 수 있다.

 

@Entity
 public class Member {
     @Id
     @GeneratedValue
     private Long id;
     
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "TEAM_ID")
     private Team team;
}

 

즉시 로딩(Eager Loading)

- 객체를 가져올 때 관련된 모든 객체들도 함께 가져오는 방식

- 객체 그래프를 한 번에 모두 가져오기 때문에 지연 로딩보다는 빠른 성능을 보여주지만, 객체 그래프가 매우 복잡하거나, 가져와야 할 데이터의 양이 많을 때는 성능 이슈가 발생할 수 있다.

 

@Entity
 public class Member {
     @Id
     @GeneratedValue
     private Long id;

     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "TEAM_ID")
     private Team team;
 }

 

# 프록시와 즉시로딩 주의

- 가급적 지연 로딩만 사용(특히 실무에서)

- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생

- 즉시 로딩은 JPQL에서 N+1 문제(하나의 쿼리로 다수의 결과가 나오는 문제)를 일으킨다.

- @ManyToOne, @OneToOne 기본이 즉시 로딩 -> LAZY로 설정

- @OneToMany, @ManyToMany는 기본이 지연 로딩

- 즉시로딩 기능이 필요하면 JPQL fetch 조인이나, 엔티티 그래프 기능을 사용한다.

반응형

'JPA' 카테고리의 다른 글

JPA의 값타입(임베디드 타입)  (0) 2023.06.18
영속성 전이와 고아객체  (0) 2023.03.25
JPA-프록시(Proxy)  (0) 2023.03.25
JPA  (0) 2022.07.14

+ Recent posts