즉시 로딩과 지연 로딩
Member만 조회하고 싶을때,
Team
을 가져와야 하나?
지연 로딩 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;
..
}
지연로딩 (LAZY
)를 하게 되면, Team
을 프록시로 가져온다.
Member와 Team을 계속 같이 쓴다면?
@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;
..
}
프록시를 사용하지 않고 즉시 다 가져옴
즉시로딩(EAGER
) 사용시, Member
조회할때 항상 Team
도 조회
프록시와 즉시로딩 주의
- 실무에서는 지연 로딩(
LAZY
)만 사용 - 즉시 로딩을 사용하면 전혀 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
N+1이란, 쉽게 말해Member
를 조회하면Team
을 무조건 가져오므로,
무조건 1개의 쿼리가 나갈때Team
을 조회하는 쿼리가 하나 더 나간다.
100개의 데이터를 조회하면 100 + 100개를 조회해야하므로, 양이 많아질수록 문제가 발생할 수 있음 @ManyToOne
,@OneToOne
은 기본이 즉시 로딩 -> LAZY로 설정
JPQL에서도 join fetch
등을 이용해 EAGER
을 사용할 수 있음.
(LAZY
가 걸려있어도 값을 가져옴)
Author And Source
이 문제에 관하여(즉시 로딩과 지연 로딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seungju0000/즉시-로딩과-지연-로딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)