대리
프록시는 실제 개체를 가리키는 가짜 개체입니다.
실제 클래스를 상속받아 생성되며 실제 클래스와 동일한 외형을 가집니다.
프록시 객체는 실제 객체(목적지)에 대한 참조를 유지합니다. 따라서 프록시 개체를 호출하면 프록시 개체가 실제 개체의 메서드를 호출합니다.

jpa에서 프록시 엔터티 개체를 호출하는 메서드는 em.getReference()입니다.
em.find()는 데이터베이스를 통해 실제 엔터티 개체를 검색하지만
em.getReference()는 데이터베이스 조회를 지연시키는 가짜(프록시) 엔터티 개체를 검색합니다.

프록시 개체의 초기화

- 프록시 객체에서 getName()과 같은 메서드를 사용하는 경우
- 프록시 개체는 지속성 컨텍스트에 초기화 요청을 합니다.
- 지속성 컨텍스트에서 실제 DB를 쿼리하여
- 실제 엔터티를 만듭니다.
- 프록시 객체는 생성된 엔터티의 getName()을 호출하여 결과를 알립니다.
프록시의 특성
- 프록시 객체는 처음 사용될 때 한 번만 초기화됩니다.
- 프록시 개체를 초기화할 때 프록시 개체는 실제 엔터티로 캐스팅되지 않습니다. 초기화 후 실제 엔터티는 프록시 개체를 통해 액세스할 수 있습니다.
- 프록시 개체는 원래 엔터티에서 상속되므로 해당 유형을 확인할 때 주의해야 합니다. (== 비교 실패, 대신 인스턴스 사용)
- 찾고 있는 엔터티가 지속성 컨텍스트에 이미 있는 경우 em.getReference()를 호출하면 실제 엔터티가 반환됩니다.
- 지속성 컨텍스트가 도움이 되지 않는 반영구적 상태에서 프록시가 초기화될 때 문제가 발생합니다. (Hibernate는 org.hibernate.LazyInitializationException 예외를 발생시킨다)
게으른 가게
멤버와 팀이 다대일 관계인 경우 멤버 검색 시 팀을 함께 검색해야 하나요?
구성원 정보만 출력할 경우 팀 정보는 필요하지 않습니다.
이 경우 사용되는 방법은 지연 로딩입니다.
데이터베이스에서 실제 팀 개체를 가져오는 대신 한 가지 방법은 필요할 때 프록시를 통해 가져오는 것입니다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY) //**
@JoinColumn(name = "TEAM_ID")
private Team team;
..
}
@ManyToOne에서 FetchType을 LAZTY로 설정하면 Lazy Loading으로 동작한다.
코드를 통해 어떻게 작동하는지 살펴보겠습니다.
em.find를 통해 구성원 엔터티를 찾으면 팀을 지연 로드하여 프록시를 만듭니다.

get.Team()에 의해 실제 팀이 사용되는 시점에서 프록시를 초기화하고 DB를 조회한다.

인스턴트 로딩
즉시 로드는 엔터티가 쿼리될 때 모든 내부 관계를 즉시 검색합니다.
Member 검색은 Team도 검색하는데, 이 때 Proxy를 사용하지 않고 실제 Object를 DB에서 가져옵니다.

@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER) //**
@JoinColumn(name = "TEAM_ID")
private Team team;
..
}
FetchType이 @ManyToOne에서 Eager로 설정되면 즉시 로드로 작동합니다.
즉시 로딩에는 몇 가지 약점이 있습니다.
즉시 로드하면 예기치 않은 SQL이 발생할 수 있습니다.
Eager 로딩은 또한 JPQL에서 N+1 문제를 일으킵니다.
졸업 증서
가능하면 즉시 로드를 사용하십시오.
@ManyToOne 및 @OneToOne은 기본적으로 즉시 로드되므로 지연 로드로 변경해야 합니다.
@OneToMany 및 @ManyToMany는 기본적으로 지연 로딩을 사용합니다.
원천 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
![#2 [경영이론] 2. 테일러의 #2 [경영이론] 2. 테일러의](https://en.egegg.kr/wp-content/plugins/contextual-related-posts/default.png)