[JPA 긴급학습 (8)] 프록시와 즉시로딩, 지연로딩

1730 단어 JPAJPA

프록시가 필요한 이유

아래 두 Entity가 정의되었다고 가정하자.

@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;
}

아래와 같은 코드를 실행한다고 했을 때,

sout(member.getUsername());
sout(team.getName());

문제가 team.getName()에서 나타난다.
team.getName()이 없다면?
member를 가져왔는데... team을 안 쓸 거라면?
★★★굳이 Member.team를 DB에서 같이 조회하는 것은 효율적이지 않다★★★

그래서 JPA에서는 이런 문제를 해결하려고 Entity가 실제 사용될 때까지 DB 조회 지연하는 방법을 제공한다.
이거를 지연로딩이라고 한다.

필요한 순간에.. 예를 들면 team.getName()이 호출되는 순간에.. DB에서 team 정보를 가져오는 것이다.

그런데 문제는 이런 지연로딩 기능을 사용하려면 실제 Entity 대신에 DB 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다.

프록시 개념 설명

JPA에서 실제 Entity를 조회할 때는

 User user = em.find(User.class, "1L");

뭐 이런 식. 그러면 DB에서 읽어오는거.
근데 미루고 싶으면

  User user = em.getReference(User.class, "1L");

이 메소드를 호출하면 JPA는 실제 DB를 조회하지 않고, Entity객체도 생성하지 않는다. 대신에 DB 접근을 위임한 프록시 객체를 반환한다.

프록시 객체

프록시 클래스는 실제 클래스를 상속 받는다.

public class Proxy_User extends User {
	
    private User user;
    
    public Long getId();

	public String userName();
       
}

좋은 웹페이지 즐겨찾기