반응형
# 지연 로딩
가급적 지연 로딩 사용!
연관된 엔티티를 프록시 객체로 가져옴
실제 사용할 때 프록시 초기화(디비에서 조회해서 가져옴)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
# 즉시 로딩
주로 연관된 엔티티를 함께 조회해서 사용할 때 사용
조인 쿼리로 조회
★@ManyToOne, @OneToOne => 기본이 즉시로딩이므로 Lazy로 설정해줘야함★
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
★즉시 로딩은 JPQL에서 N+1 문제 일으킴★
JPQL은 SQL로 번역해서 실행함 (최적화X)
-> 우선 member를 조회해온 후에 즉시로딩인 경우 team을 조회하는 쿼리가 또 나감 (em.find()는 최적화해서 조인으로 조회)
총 쿼리 수 = member조회 SQL 1번 + 조회된 member의 수 만큼 team 조회 SQL N번
해결 방법
1. fetch 조인 (대부분 이걸로 해결)
List<Member> members = em.createQuery("select m from member m join fetch m.team", Member.class)
.getResultList();
2. EntityGraph 어노테이션
3. BatchSize
반응형
'개발 > JPA' 카테고리의 다른 글
[JPA] Hibernate Query Language(HQL) Projection / 하이버네이트 쿼리 언어 프로젝션 조회 / 특정 컬럼만 조회 / 예문 (0) | 2022.04.11 |
---|---|
[JPA] 연관관계 영속성 전이 CASCADE (0) | 2022.04.07 |
[JPA] 프록시 (0) | 2022.04.06 |
[JPA] 상속관계 매핑 - 상속 전략 (0) | 2022.04.06 |
[JPA] 영속성 컨텍스트 / 엔티티의 생명주기 (0) | 2022.03.31 |
댓글