즉시 로딩
⇒ 연관된 엔티티를 즉시 조회 후 영속성 컨텍스트에 저장
- 연결된 모든 데이터를 즉시 가지게 된다는 것.
문제점
- 조인해서 가져오는 엔티티가 많아질수록 쿼리가 어떻게 실행될지 개발자가 예측하기 힘듦
- 사용하지 않은 엔티티도 한꺼번에 가져오기 때문에 성능상 문제가 발생할 수 있음
- @ManyToOne, @OneToOne처럼 One으로 끝나는 것들은 기본값이 즉시 로딩
- @OneToMany, @ManyToMany처럼 Many로 끝나는 것들은 기본값이 지연 로딩
- 즉시 로딩 대신에 지연 로깅 방식 사용
-> (fetch = FetchType.*LAZY*) 연관관계 어노테이션 뒤에 붙이기
// 양방향 매핑을 하기 위해 설정, 영속성 전이 설정, 고아객체 설정(고아객체가 되면 다 날려버리겠다는 것)
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<OrderItem> orderItems = new ArrayList<>();
지연 로딩
연관된 엔티티는 사용할 때 조회하는 Fetch LAZY 타입
⇒ 연관된 엔티티를 프록시 형태로 영속성 컨텍스트에 저장
⇒ 연관된 엔티티를 실제 사용하는 시점에 JPA가 SQL 호출해 조회해 옴.
- 해당 전략이 선택된 필드는 접근 전까지 데이터를 가져오지 않음.
- 즉, 필요할 때 데이터를 불러온다는 뜻
- 따라서 성능상 우위를 점함. ( 웬만하면 LAZY 쓰라는 이유 )
- 실제 비즈니스 구현 시 매핑되는 엔티티의 개수 ↑
- 사용하지 않는 데이터도 한꺼번에 조회하므로 성능 ↓
- @ManyToOne 어노테이션에 fetch 설정 지정
import jakarta.persistence.*;
import kr.spring.item.entity.Item;
import kr.spring.utils.entity.BaseEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
public class OrderItem extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
private int orderPrice;
private int count;
private LocalDateTime regTime;
private LocalDateTime updateTime;
}
연관 관계 매핑 지연로딩 설정
- 연관 관계가 맺어진 엔티티의 fetch 전략을 모두 LAZY로 설정
'Web & Android > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 영속성 전이, 고아객체 (0) | 2023.10.15 |
---|---|
[Spring Data JPA] 연관 관계 매핑 (0) | 2023.10.15 |
[Spring Data JPA] Querydsl (0) | 2023.10.15 |
[Spring Data JPA] @Query (0) | 2023.10.14 |
[Spring Data JPA] JPA (0) | 2023.10.14 |