[JPA] 지연로딩과 즉시로딩
지연로딩
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>

```java
Member member = em.find(Member.class, 1L); // 이 부분에서 TEAM을 가져오지않음 지연로딩으로인해
Team team = member.getTeam();
team.getName(); //실제 team을 사용하는 시점에 초기화 (DB조회) 하는것!!!
즉시로딩
@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는 기본이 지연로딩이다.
지연로딩의 활용
- Member와 Team이 자주 함께 사용된다 - > 즉시로딩
- Member와 Order는 가끔 사용 - > 지연로딩
- Order와 Product는 자주 함께 사용 -> 즉시로딩
해당 구성1
해당 구성 2
실무 주의점
- 모든 연관관계에 대해 지연 로딩을 사용하는것이 좋다.
- 실무에서 즉시로딩을 사용하지 않아야한다.
- JQP fetch 조인이나, 엔티티 그래프 기능을 사용할 수 있다.
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모