[jpa Series] 05.proxy
December 6, 2024
Proxy
- 엔티티 조회할 때 무조건 연관 관계를 사용하는 것이 아니므로 필요할 때 호출하는 것이 최적일 수도 있다.
- 이를 지연로딩이라고 한다. 사용 시점이 값을 DB에서 당겨온다.
- 이 전까지는 프록시로 대체한다.
entityManager.getReference()로 proxy를 부를 수 있다.
- 특징으로는
- 처음 사용할 때 한 번만 초기화된다.
- 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것이 아니다. 프록시를 통해서 실제에 접근할 수 ㅅ있다.
- 프록시는 엔티티를 상속받은 객체이므로 타입 체크시에 주의해야 한다.
- 영속성 컨텍스트에 찾는 엔티티가 있으면 데이터베이스를 조회할 필요가 없으므로
entityManager.getReference()는 실제 엔티티를 뱉는다.
- 초기화는 영속성 컨텍스트의 도움을 받아야 한다.
- 프록시는
PersistenceUnitUtil.isLoaded(Object entity)로 초기화 여부를 확인할 수 있다.
즉시 로딩, 지연 로딩
- 즉시 로딩 : 엔티티 조회할 때 연관 엔티티도 함께 조회
- fetch 속성을
FetchType.EAGER로 변경
- 지연 로딩: 연관된 엔티티를 실제 사용할 떄 조회한다.
- fetch 속성을
FetchType.LAZY로 변경
- optional, nullable 여부로 inner, outerJoin이 결정된다.
JPA 기본 fetch 전략
@ManyToOne, @OneToOne: EAGER
@OneToMany, @ManyToMany: LAZY