Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
8.3 지연 로딩 활용
- Member와 연관된 Team은 자주 함께 사용되므로 즉시 로딩(EAGER)으로 설정
- Member와 연관된 Order는 가끔 사용되므로 지연 로딩(LAZY)으로 설정
- Order와 연관된 Product는 자주 함께 사용되므로 즉시 로딩(EAGER)으로 설정
회원 엔티티
@Entity
public class Member {
...
@ManyToOne(fetch = FetchType.EAGER)
private Team team;
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<Order> order;
...
}
회원을 조회할 때 실행된 SQL
SELECT
MEMBER.ID AS MEMBERID,
MEMBER.AGE AS AGE,
MEMBER.TEAM_ID AS TEAM_ID,
MEMBER.USERNAME AS USERNAME,
TEAM.ID AS TEAMID,
TEAM.NAME AS NAME
FROM
MEMBER MEMBER
LEFT OUTER JOIN
TEAM TEAM ON MEMBER.TEAM_ID=TEAM1_.ID
WHERE MEMBER0_.ID='member1'
- 회원가 팀은
EAGER
로 설정하여 조인 쿼리 실행, Order는LAZY
로 설정하여 프록시로 조회
8.3.1 프록시와 컬렉션 래퍼
컬렉션 래퍼
: 하이버네이트는 엔티티를 영속 상태로 만들 때 엔티티에 컬렉션이 있는 경우 추적하고 관리할 목적으로 원본 컬렉션을 하이버네이트가 제공하는 내장 컬렉션으로 변경하는 것
- 지연 로딩에서 엔티티는 프록시 객체를 사용, 컬렉션은 컬렉션 래퍼(프록시 역할)를 사용
member.getOrders()
초기화X,member.getOrders().get(0)
초기화O (실제 데이터를 조회할 때)- 주문내역과 상품은 EAGER로 설정했으므로 주문내역을 초기화 할때 연관 상품도 함께 로딩
8.3.2 JPA 기본 페치 전략
- fetch 속성의 기본 설정값
- @ManyToOne, @OneToOne: 즉시 로딩(FetchType.EAGER)
- @OneToMany, @ManyToMany: 지연 로딩(FetchType.LAZY)
- JPA의 기본 페치 전략은 연관된 엔티티가 하나면 즉시 로딩, 컬릭션이면 지연 로딩 사용
- 모든 연관관계에 지연 로딩을 사용하는 것을 추천
- SQL을 직접 사용하면 JPA와 같이 유연한 최적화가 어려움 각각의 테이블을 조회하다 한번에 조인으로 변경하려면 많은 SQL과 코드 수정이 필요
8.3.3 컬렉션에 FetchType.EAGER 사용 시 주의점
1. 컬렉션을 하나 이상 즉시 로딩하는 것은 권장하지 않는다.
- 컬렉션의 조인은 테이블로 보면 일대다 조인과 동일한 의미
- 일대다 조인은 결과 데이터가 다 쪽에 있는 수만큼 증가
- A 테이블을 N, M 두 테이블과 일대다 조인을하면 N * M에 데이터를 반환
- 많은 데이터의 반환은 애플리케이션 성능 저하의 요인
2. 컬렉션 즉시 로딩은 항상 외부 조인(OUTER)을 사용한다.
- 다대일 관계인 회원과 팀은 외래키 not null 제약 조건을 걸면 내부 조인을 사용
- 반대로 일대다 관계인 팀과 회원은 회원이 한 명도 없는 팀을 내부조인시 문제 발생 (팀 조회 X)
FetchType.EAGER
설정과 조인 전략- @ManyToOne, @OneToOne
- (optional = false) : 내부 조인
- (optional = true) : 외부 조인
- @OneToMany, @ManyToMany
- (optional = false) : 외부 조인
- (optional = true) : 외부 조인
- @ManyToOne, @OneToOne
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 9.1~2 기본값 타입, 임베디드 타입 (0) | 2021.08.25 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 8.4~5 영속성 전이, 고아 객체 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.1~2 프록시, 즉시 로딩과 지연 로딩 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 7.5 엔티티 하나에 여러 테이블 매핑 (0) | 2021.08.18 |
[자바 ORM 표준 JPA 프로그래밍] 7.4 조인 테이블 (0) | 2021.08.18 |