본문 바로가기
JPA Basic

JPA Basic - 6

by 완두완두콩 2021. 12. 30.

프록시


타입 체크 시 , 같은 객체를 조회해도 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

댓글