[JPA] - 즉시로딩 & 지연로딩 차이점

I'm Covy·2023년 11월 22일
0

JPA

목록 보기
1/2

즉시로딩과 지연로딩의 차이점이 무엇이에요?

즉시로딩(EAGER)은 데이터를 조회할때 연관된 데이터까지 한번에 불러오는 것이다.
지연로딩(LAZY)은 즉시로딩과 반대로 데이터를 조회할 때 필요한 시점에서 데이터를 불러오는 것이다.


<사진 출처 : 김영한 강사님의 JPA강의>

위의 관계에서 양방향으로 테이블과의 관계가 존재할 때 즉시로딩과 지연로딩이 발생하게 된다.

더 자세하게 알아보기 위하여 아래 Member클래스와 Order클래스에 대해서 알아보자

@Entity
@Table(name = "member")
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    @JsonIgnore
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

}
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {

    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @JsonIgnore
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();
    
    private LocalDateTime orderDate; //주문시간

    @Enumerated(EnumType.STRING)
    private OrderStatus status; //주문상태 [ORDER, CANCEL]

}

아래와 같이 양방향 구조인 Entity클래스가 존재한다 일대 다의 연관관계가 존재할 경우 JPQL을 사용하여 Member테이블을 존재하면 어떻게 될까?

지연로딩을 설정 하였을 경우 Member만 조회시 Member테이블만 조회가 되는 반면
즉시로딩을 설정하여 사용하였을 경우 Member클래스가 조회될 뿐만 아니라 Member와 연관된 Order테이블까지 같이 조회가 되는 것을 확인 할 수 있다.
이처럼 나는 Member테이블만 조회를 하고 싶다면 지연로딩을 걸어 주어야 한다.
즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
이러한 이유로 가급적이면 지연로딩(LAZY)를 사용하여 작업하는 방식이 더 좋다.

이로서 지연로딩과 즉시로딩에 대한 설명은 마치도록 하겠습니다.
잘못된 설명이나 부족한 부분이 있다면 댓글로 남겨주시면 저에게 정말 많은 도움이 됩니다 부탁드리겠습니다.

profile
🚀Let's become a growing developer again today!👊

0개의 댓글