Jin's Dev Story

[Spring Data JPA] 즉시로딩, 지연로딩 본문

Web & Android/Spring Data JPA

[Spring Data JPA] 즉시로딩, 지연로딩

woojin._. 2023. 10. 15. 09:43

즉시 로딩

⇒ 연관된 엔티티를 즉시 조회 후 영속성 컨텍스트에 저장

  • 연결된 모든 데이터를 즉시 가지게 된다는 것.

문제점

  • 조인해서 가져오는 엔티티가 많아질수록 쿼리가 어떻게 실행될지 개발자가 예측하기 힘듦
  • 사용하지 않은 엔티티도 한꺼번에 가져오기 때문에 성능상 문제가 발생할 수 있음
  • @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