목차로 돌아가기

모든 연관관계는 지연로딩으로 설정

  • 즉시로딩(EAGER:이거)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
  • 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
  • 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.
  • @XToOne(OneToOne, ManyToOne) 관계(어쩌고 One관계)는 기본이 즉시로딩(EAGER)이므로 반드시 직접 지연로딩으로 설정해야 한다.
    • OneToMany는 기본이 LAZY이다.
예시

기존 LAZY(지연로딩)에서 EAGER(즉시로딩)로 바꾼다면

public class Order {
    @ManyToOne(fetch = FetchType.LAZY) ->@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "member_id")
    private Member member; //주문 회원
}
N+1 문제

em.find같은 경우(한 건 조회)에서는 문제가 발생하지 않는다.

JPQL과 같이 'select o From order o;' 의 경우에는 SQL select * from order로 번역되고 100개가 조회 되었다고 가정하면,

member가 EAGER이면 해당 100개가 member를 가져오기 위해서 100번 발생한다. 왜냐하면 EAGER라는게 조인해서 한 번에 가져온다는 것이 아니고 order를 조회하는 시점에 member 테이블을 꼭 같이 조회하겠다는 뜻

해결방법
  • 즉시로딩이 아닌 지연로딩으로 항상 설정한다. @XToOne=LAZY
  • fatch join 또는 엔티티 그래프 기능을 사용한다.  

'Back-end > JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2022.08.06
[JPA] JPA 영속성 컨텍스트  (0) 2022.05.05
[JPA] Batch Insert  (0) 2022.05.05
JPA 소개  (0) 2022.03.14
자바 ORM 표준 JPA 프로그래밍  (0) 2022.03.14

+ Recent posts