JPA/Proxy

[JPA] 즉시 로딩과 지연 로딩

Boradoris 2023. 3. 4. 12:48

Member를 조회할 때 Team도 함께 조회해야 할까?

단순히 member 정보만 사용하는 비즈니스 로직
println(member.getName());

 

 

 

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

@Entity
public class Member {
 @Id
 @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 
 @ManyToOne(fetch = FetchType.LAZY) //**
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 ..
 }

 

  • fetch = FetchType.LAZY
  • 지연 로딩 설정

 

지연 로딩

 

 

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

 

  • Team team = member.getTeam();
  • team.getName(); // 실제 team을 사용하는 시점에 초기화(DB 조회)

 

 

Member와 Team을 자주 함께 사용한다면?

즉시 로딩 EAGER를 사용해서 함께 조회

@Entity
public class Member {
 @Id
 @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 
 @ManyToOne(fetch = FetchType.EAGER) //**
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 ..
 }

 

  • fetch = FetchType.EAGER
  • 즉시 로딩 설정
  • 참고 : default 값 == EAGER

 

즉시 로딩

 

즉시 로딩(EAGER), Member조회 시 항상 Team도 조회

 

  • JPA 구현체는 가능하면 조인을 사용해서 SQL 한 번에 함께 조회

 

 

프록시와 즉시로딩 주의

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

 


출처 : https://www.inflearn.com/course/ORM-JPA-Basic

'JPA > Proxy' 카테고리의 다른 글

[JPA] 영속성 전이(CASCADE)와 고아 객체  (0) 2023.03.04
[JPA] Proxy (프록시)  (0) 2023.03.04