728x90
출처: 자바 ORM 표준 JPA 프로그래밍
프록시 객체는?
엔티티를 조회할때, 프록시 객체를 생성하여 그것을 대신 조회할수있다.
em.find() 말고 em.getReference()를 호출하면, 일어나는 일들이다:
1. 진짜 엔티티를 상속하고 구조도 같은 프록시 객체가 만들어짐. 이 안에 실제 데이터는 없다.
2. 이렇게 얻은 객체에서 필드를 호출함
3. 그 순간 영속성 컨텍스트로 초기화 요청이 오고, 진짜 엔티티를 생성함
4. 프록시 객체가 진짜 객체로 요청을 다시 보내고 받아온 후 반환함.
한번만 초기화 되며,
프록시 객체 생성 전에 이미 영속성 컨텍스트에 진짜 엔티티 객체가 들어와 있으면, 그냥 진짜를 반환함.
.
.
.
이런 프록시 객체는 어디에 사용될까?
지연로딩(lazy loading)에 사용된다.
지연로딩
예시: @ManyToOne(fetch = FetchType.LAZY)
이전에 정리한 내용에서 말했듯이,
한 엔티티를 조회하면 그와 연관된 엔티티를 조회할때 join을 사용하여 같이 조회한 후 저장해놓는다.
하지만
그 엔티티와 매핑된 엔티티가 아주 많다면?
퍼포먼스가 아주 안좋을것이다.
이때 지연로딩을 사용하면, 조회하는 시점에 프록시 객체를 저장해놓는다.
실무에서는
성능문제와 JPQL 사용시의 N + 1 문제 때문에,
거의 지연로딩만 사용한다고 한다.
EAGER(즉시조회) 로 조회하는 장점은.
JPQL fetch 조인이나 엔티티 그래프 기능을 사용하는것으로 얻는다.
728x90
'Dev > JPA' 카테고리의 다른 글
[강의정리] 값 타입 (0) | 2021.05.21 |
---|---|
[강의정리] 영속성 전이, 고아객체, 생명주기 (0) | 2021.05.18 |
[강의정리] 상속관계 매핑 (0) | 2021.05.18 |
[강의정리] 연관관계 매핑 (0) | 2021.05.17 |
[강의정리] 엔티티 매핑 (0) | 2021.05.17 |