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;
지연 로딩
지연 로딩 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;
즉시 로딩(EAGER), Member조회 시 항상 Team도 조회
프록시와 즉시 로딩 주의
- 가급적 지연 로딩만 사용(특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
- @ManyToOne, @OneToOne은 기본이 즉시로딩 LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
지연 로딩 활용 - 실무
- 모든 연관관계에 지연 로딩을 사용해라!
- 실무에서 즉시 로딩을 사용하지 마라!
- JPQL fech 조인이나, 엔티티 그래프 기능을 사용해라!
- 즉시 로딩은 상상하지 못한 쿼리가 나간다.
이 글은 인프런의
제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'Spring > 스프링 JPA' 카테고리의 다른 글
값 타입 - 기본값 타입, 임베디드 타입 (0) | 2022.04.01 |
---|---|
영속성 전이 : CASECADE (0) | 2022.03.31 |
프록시 (0) | 2022.03.30 |
고급 맵핑 (0) | 2022.03.30 |
다양한 연관관계 맵핑 (0) | 2022.03.29 |