728x90
지연 로딩 LAZY을 사용해서 프록시로 조회



TEST

- team을 실제 사용할 때, 쿼리가 나가는 게 핵심이다.
즉시 로딩 EAGER를 사용해서 함께 조회




프록시와 즉시 로딩 주의
- 가급적 지연 로딩만 사용(특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
Team team1 = new Team();
team1.setName("teamA");
em.persist(team1);
Team team2 = new Team();
team2.setName("teamB");
em.persist(team2);
Member member1 = new Member();
member1.setUsername("hello1");
member1.setTeam(team1);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("hello2");
member2.setTeam(team2);
em.persist(member2);
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m ",Member.class).getResultList();

해결 방안
- fetchJoin = 런타임 시 내가 원하는 것만 조인 쿼리를 날려서 가지고 온다.
List<Member> members = em.createQuery("select m from Member m join fetch m.team",Member.class).getResultList();

- Entity 그래프로 해결
- 배치 Size로 해결
@ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
@OneToMany, @ManyToMany는 기본이 지연 로딩
지연 로딩 활용


- Member와 Team은 자주 함께 사용 -> 즉시 로딩
- Member와 Order는 가끔 사용 -> 지연 로딩
- Order와 Product는 자주 함께 사용 -> 즉시 로딩
주의할 점
- 모든 연관관계에 지연 로딩을 사용해라!
- 실무에서 즉시 로딩을 사용하지 마라!
- JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라! (뒤에서 설명)
- 즉시 로딩은 상상하지 못한 쿼리가 나간다.
728x90
'자바 ORM 표준 JPA 프로그래밍(인프런)' 카테고리의 다른 글
| Ch08. 프록시와 연관관계 관리 - 실전 예제(연관관계 관리) (0) | 2021.12.15 |
|---|---|
| Ch08. 프록시와 연관관계 관리 - 영속성 전이(CASCADE)와 고아 객체 (0) | 2021.12.15 |
| Ch08. 프록시와 연관관계 관리 - 프록시 (0) | 2021.12.15 |
| Ch07. 고급 매핑 - 실전 예제(상속관계 매핑) (0) | 2021.12.14 |
| Ch07. 고급 매핑 - @MappedSuperclass(매핑 정보 상속) (0) | 2021.12.14 |