Spring/스프링 JPA

즉시 로딩과 지연 로딩

코징 2022. 3. 31. 16:34

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