지연로딩

지연로딩1

fetch = FetchType.LAZY 를 통해 호출시 프록시에서 가져온다.

지연로딩 LAZY을 사용해서 프록시로 조회 ```java @Entity public classs Member { @Id @GeneratedValue private Long id;

@Column(name = “USERNAME”) private String name;

@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name=”TEAM_ID”) private Team team;

}


<br>

![지연로딩2](https://user-images.githubusercontent.com/52389219/158741880-5e05595c-b632-45bd-855a-b7b7f633cb6a.PNG)

```java
Member member = em.find(Member.class, 1L); // 이 부분에서 TEAM을 가져오지않음 지연로딩으로인해
 Team team = member.getTeam();
 team.getName(); //실제 team을 사용하는 시점에 초기화 (DB조회) 하는것!!!

즉시로딩

즉시로딩1


@Entity
public classs Member { 
  @Id
  @GeneratedValue
  private Long id;
  
  @Column(name = "USERNAME")
  private String name;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="TEAM_ID")
  private Team team;
}
  • 즉시로딩(EAGER), Member 조회시 항상 TEAM도 조회한다.
  • JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회한다.


프록시와 즉시로딩 주의

  • 가급적 지연로딩만 사용한다. ( 실무에서 )
  • 즉시 로딩을 적용하면 예상치 못한 SQL이 발생할 수 있다.
  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩 - > LAZY로 설정해야한다.
  • @OneToMany, @ManyToMany는 기본이 지연로딩이다.


지연로딩의 활용

지연로딩3

  • Member와 Team이 자주 함께 사용된다 - > 즉시로딩
  • Member와 Order는 가끔 사용 - > 지연로딩
  • Order와 Product는 자주 함께 사용 -> 즉시로딩


해당 구성1

지연로딩4


해당 구성 2

지연로딩5


실무 주의점

  • 모든 연관관계에 대해 지연 로딩을 사용하는것이 좋다.
  • 실무에서 즉시로딩을 사용하지 않아야한다.
  • JQP fetch 조인이나, 엔티티 그래프 기능을 사용할 수 있다.


😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재

🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

개인메모

태그:

카테고리:

업데이트: