이번 장에서는 프록시와 즉시로딩, 지연로딩 그리고 영속성 전이와 고아객체에 대해서 알아보자.
@Entity
public class Member {
private String username;
@ManyToOne
private Team team;
public Team getTeam(){
return team;
}
public String getUsername(){
return username;
}
}
@Entity
public class Team {
private String name;
public String getName() {
return name;
}
}
public void printUserAndTeam(String memberId) {
Member member = em.find(Member.class, memberId);
Team team = member.getTeam();
System.out.println("회원이름 : " + member.getUsername());
System.out.println("소속팀 : " + team.getName());
}
public String printUser(String memberId) {
Member memeber = em.find(Member.class, memberId);
System.out.println("회원이름 : " + member.getUsername());
}
printUserAndTeam
메서드를 통해서 회원에 대한 내용과 팀에 대한 내용도 출력하는 것을 볼 수 있다.printUser
의 경우에는 회원에 대한 내용만 출력하고 팀에 대한 내용은 출력하지 않는다.
사용하지도 않는 팀에 대한 정보를 DB에서 함께 조회하는 것은 효율적이지 않다.printUser
메서드에서 회원에 대한 정보만 가져와서 사용할 수 있게 되는 것이다.EntityManager.getReference()
를 이용하면 된다.프록시의 초기화 과정에 대해서 살펴보자.
// Member Proxy
Member member = em.getReference(Member.class, "id1");
member.getName(); // 1. getName() 호출
class MemberProxy extends Member {
Member target = null;
public String getName(){
if(target == null){
// 2. 초기화 요청
// 3. DB 조회
// 4. 실제 엔티티 생성 및 참조 보관
}
// 5. target.getName();
return target.getName;
}
}
getName()
을 통해 실제 데이터를 요청하게된다.특징