JPA를 알아보자-(5) 즉시로딩과 지연로딩

1 분 소요

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

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

즉시로딩

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

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에 저장해두는 것이 효율적일 것이다.

지연로딩

Join해서 모든 정보를 사전에 미리 다 검색을 하는게 아니라 실질적으로 필요한 시점에 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을 연계하는 상황이 없다면 이것이 더 효율적일 수 있다.

카테고리:

업데이트:

댓글남기기