JPA5

로딩

즉시로딩과 지연로딩


JPA에서 DB에 접속하는 방법은 두 가지가 있다.

  1. 일단 관련 데이터는 싹 다 긁어서 오는 즉시 로딩이고
  2. 필요한 것만 그때 그때 가져오는 지연로딩

즉시로딩

무조건 연계된 모든 table의 정보를 join해서 한번에(사전에) 검색하는 기술

JPA에서 자체적으로 Join을 해서 가져온다.

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별로 검색을 시도한다.

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