Written by
최태열
on
on
JPA5
로딩
즉시로딩과 지연로딩
JPA에서 DB에 접속하는 방법은 두 가지가 있다.
- 일단 관련 데이터는 싹 다 긁어서 오는 즉시 로딩이고
- 필요한 것만 그때 그때 가져오는 지연로딩
즉시로딩
무조건 연계된 모든 table의 정보를 join해서 한번에(사전에) 검색하는 기술
JPA에서 자체적으로 Join을 해서 가져온다.
- Member 클래스의 값을 찾아서 Id만 출력해보겠다.
Java
@Builder
@Entity
@SequenceGenerator(name="member_id_seq_gen", sequenceName="member_id_seq", initialValue=1, allocationSize=50)
public class Member {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="member_id_seq_gen")
@Column(name="member_id")
private Long memberId;
@Column(length=20)
private String name;
private int age;
@ManyToOne
@JoinColumn(name="team_id")
private Team teamId;
}
.
.
.
.
Member sm = em.find(Member.class, m1.getMemberId());
SQL
@ManyToOne
select member0_.member_id as member_i1_0_0_,
member0_.age as age2_0_0_,
member0_.name as name3_0_0_,
member0_.team_id as team_id4_0_0_,
team1_.team_id as team_id1_1_1_,
team1_.team_name as team_nam2_1_1_
from Member member0_, Team team1_
where member0_.team_id=team1_.team_id(+) and member0_.member_id=?
원하지도 않은 Team 클래스의 객체까지 찾아서 같이 select를 한다.
비효율적으로 보일 수 있지만, 이후에 team 객체를 또 호출할 것이라면 persistence context에 저장해두는 것이 효율적일 것이다.
지연로딩
조인해서 모든 정보를 사전에 미리 다 검색을 하는게 아니라 실질적으로 필요한 시점에 select를 table별로 검색을 시도한다.
- Member 클래스의 값을 찾아서 Id만 출력해보겠다.
Java
@Builder
@Entity
@SequenceGenerator(name="member_id_seq_gen", sequenceName="member_id_seq", initialValue=1, allocationSize=50)
public class Member {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="member_id_seq_gen")
@Column(name="member_id")
private Long memberId;
@Column(length=20)
private String name;
private int age;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="team_id")
private Team teamId;
}
.
.
.
.
Member sm = em.find(Member.class, m1.getMemberId());
SQL
@ManyToOne(fetch=FetchType.LAZY)
select member0_.member_id as member_i1_0_0_,
member0_.age as age2_0_0_,
member0_.name as name3_0_0_,
member0_.team_id as team_id4_0_0_
from Member member0_
where member0_.member_id=?
굳이 Team table까지 가지 않고 Member 클래스만 검색한다.
Team table과 Member table을 연계하는 상황이 없다면 이것이 더 효율적일 수 있다.
Discussion and feedback