JPA 즉시로딩과 지연로딩

OAT·2023년 8월 8일
0

JPA는 데이터를 조회할 때, FetchType으로 지연로딩(LAZY)과 즉시로딩(EAGER)이 있다.

참고로 JPA FetcyType의 default값은 @xxToOne에서는 EAGER, @xxToMany에서는 LAZY이기 때문에 상황에 따른 수동 설정이 필수적이다.

FetchType?

Fetch는 JPA에서 연관관계의 데이터를 어떻게 가져올 것인가를 말하는데, FetchType은 이 설정값에 해당한다.

위 테이블에서 ORDERS 정보를 알고싶을 때 FK로 설정된 Member과 Delivery 정보까지 모두 불러온다면, 매우 손해일것이다.
이와 같이 특정 엔티티를 조회할 때 연관된 모든 엔티티를 같이 로딩하는 것을 즉시 로딩(Eager Loading)이라고 한다.

이로 인한 성능 저하 문제로 JPA는 지연 로딩(Lazy Loading)을 지원한다. LAZY 로딩일 때 order에 대한 조회 쿼리만 실행되고 member 정보는 프록시 객체로 생성하여 남겨둔다.
order.member.getmemberid() (예시)와 같이 member 정보를 실제로 조회하는 순간 조회가 이루어진다.

따라서 실무에서는 지연 로딩을 사용하는 것을 지향한다.
(즉시 로딩을 사용하였을 때 JPQL에서 N+1 문제가 발생할 수 있는데, 이는 따로 다뤄보도록 하겠다.)

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

유익한 글이었습니다.

답글 달기