Member를 조회할 때 Team도 함께 조회해야 할까?
지연 로딩 LAZY을 사용해서 프록시로 조회
@Entity
public class Member extends BaseEntity {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)// 팀을 프록시로 조회한다.@JoinColumn
private Team team;
Java
복사
지연 로딩
지연 로딩 LAZY을 사용해서 프록시로 조회
•
em.find(Member.class, 1L);로 조회를 하게 되면 멤버는 DB에서 조회 후 영속성 컨텍스트에 저장하게 되는데, 이때 Team은 프록시로 가짜 객체로 참조값이 널로 들어가 있는다.
•
이후 team.getName();을 하게 될 때, 해당하는 값을 DB에서 조회(초기화) 후 참조 값이 Null인 곳에 데이터를 넣어준다.
즉시 로딩 EAGER를 사용해서 함께 조회
즉시 로딩 EAGER을 사용해서 프록시로 조회
@Entity
public class Member extends BaseEntity {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER)// 팀을 프록시로 조회한다.@JoinColumn
private Team team;
Java
복사
즉시 로딩(EAGER), Member조회 시 항상 Team도 조회
프록시와 즉시 로딩 주의
•
가급적 지연 로딩만 사용(특히 실무에서)
•
즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
•
즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
•
@ManyToOne, @OneToOne은 기본이 즉시로딩 LAZY로 설정
•
@OneToMany, @ManyToMany는 기본이 지연 로딩
지연 로딩 활용 - 실무
•
모든 연관관계에 지연 로딩을 사용해라!
•
실무에서 즉시 로딩을 사용하지 마라!
•
JPQL fech 조인이나, 엔티티 그래프 기능을 사용해라!
•
즉시 로딩은 상상하지 못한 쿼리가 나간다.
이 글은 인프런의
제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.