[JPA 긴급학습 (8)] 프록시와 즉시로딩, 지연로딩
프록시가 필요한 이유
아래 두 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();
}
Author And Source
이 문제에 관하여([JPA 긴급학습 (8)] 프록시와 즉시로딩, 지연로딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@red_gunny/JPA-긴급학습-8-프록시와-즉시로딩-지연로딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)