프록시
타입 체크 시 , 같은 객체를 조회해도 em.find 와 em.Reference(Proxy) 객체 값이 차이가 있기 때문에 값은 같더라도 다르다고 나오게 된다. -> instanceof 로 비교.
하지만 하나의 트랜잭션 안에서는 find 와 Reference 비교를 하게 되면 == 으로 비교해도 똑같다. -> proxy 가 아닌 실제 엔티티 반환
영속성 컨텍스트를 꺼버리면(em.close , em.detach) -> exception 이 터지게 된다.
초기화 여부는 EntityManagerFactory 를 통해서 조회.
※ 프록시는 실제로 사용하는 경우는 많지 않지만 즉시 로딩과 지연 로딩을 이해하기 위해서 필요한 과정.
즉시 로딩 & 지연 로딩
지연 로딩
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Teams teams;
fetch = FetchType.Lazy -> 지연 로딩 설정
Member 테이블을 조회하고자 하는 경우 , 이전의 경우에는 team 테이블도 같이 조회가 돼서 성능 저하.
지연 로딩을 하는 경우 , team 은 Proxy 로 조회하기 때문에 성능 향상.
만약 Member 객체에서 team 도 조회하는 경우 , Proxy 가 아닌 쿼리문이 생성돼서 조회가 된다.
-> team 을 실제 사용하는 경우에 초기화 돼서 접근 -> Proxy 접근이 아니다.
즉시 로딩
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Teams teams;
fetch = FetchType.Eager -> 즉시 로딩 설정
실행 즉시 Proxy 가 아닌 테이블 간의 join 을 통해 쿼리문을 날려서 실제 값을 출력한다.
-> Member 테이블과 Team 테이블을 자주 함께 사용하는 경우에 사용한다. ( 대부분 Member 를 쓸 때 Team 도 같이 쓰는 경우)
정리
* 해당 글은 'Infleran'의 김영한 강사님의 자료를 참조하였습니다.
'JPA Basic' 카테고리의 다른 글
지연 로딩 & 조회 (0) | 2022.03.23 |
---|---|
변경 감지(Dirty Checking) & 병합(Merge) (1) | 2022.03.21 |
JPA Basic - 5 (0) | 2021.12.29 |
JPA Basic - 4 (0) | 2021.12.28 |
JPA Basic - 3 (0) | 2021.11.18 |
댓글