Search
Duplicate

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

날짜
2022/04/29 05:23
상태
스프링 JPA 기본
속성 1
Spring
JAVA
JPA
담당자

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 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.