이전 글에서 JPA의 프록시를 조금 다뤄봤습니다.
[Spring] Proxies in Spring
Proxy? 스프링을 공부하다보면 Proxy 라는 단어를 많이 접하게 됩니다. 내가 알고있는 프록시와 어떤 것이 다를까 찾아보다가 재미있는 표현을 찾았습니다. 한 Article의 저자는 바로 마법같은 일로
wch18735.tistory.com
이 후, 요즘 읽고있는 JPA 책에서 Proxy 부분을 다시 읽어보며 정리한 내용에 대해 어느 정도 확신을 가지게 되었습니다.
제가 이해한 프록시를 한 마디로 정리하자면, 프록시란 어떤 행동을 대신 수행하는 모방체 입니다.
프록시는 대리인이다.
물론 그러다가 진짜가 필요한 순간이 오면?
짠! 하고 나타나는게 JPA의 프록시 객체입니다.
지연 로딩을 위한 프록시(Proxy)
엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아닙니다.
가령, 회원과 회원이 주문한 상품 정보가 서로 연관이 있다고 가정하겠습니다.
단순히 회원 목록이 필요한 경우, 연관된 Product 정보 조회는 필요 없습니다.
JPA는 이런 문제를 해결하고자 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공합니다.
이렇게 조회 시점을 늦춰 성능을 높이는 방법을 지연 로딩이라고 합니다.
이렇게 적시(TIMELY) 행동에 따른 성능 향상이란 사상을 실체화하기 위해서는 가짜 객체가 필요합니다.
그리고 그 가짜 객체 역할을 수행하는 것이 바로 프록시 객체입니다.
프록시 특징
프록시 특징은 아래와 같습니다.
- 프록시 객체는 해당 객체 원본을 사용하기 위한 요청이 처음 들어온 그 순간, 비로소 초기화된다.
- 프록시 객체를 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다.
- 프록시 객체가 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근할 수 있다.
- 프록시 객체는 원본 엔티티를 상속받은 객체이지 원본 자체가 아니다.
- 영속성 컨텍스트에 엔티티가 있다면, EntityManager 의 getReference() 호출에도 실제 엔티티를 반환받을 수 있다.
- 준영속 상태 프록시를 초기화하면 org.hibernate.LazyInitializationException 예외를 발생시킨다.
지연 로딩의 반대는?
지연 로딩의 반대 개념은 즉시 로딩입니다.
매우 직관적인 이름답게 개념 역시 프록시를 사용하지 않고 즉시 로딩해 엔티티를 확보한다라는 의미가 있습니다.
둘은 FetchType.LAZY 와 FetchType.EAGER 로 표현됩니다.
'Backend > JPA' 카테고리의 다른 글
[JPA] JPQL을 Test 하는 간단한 방법 (0) | 2023.07.23 |
---|---|
[JPA] 다대다(N:N) 관계 (0) | 2023.07.03 |
[JPA] 영속성 컨텍스트 1차 캐시의 주의점 (0) | 2023.06.06 |
[JPA] org.hibernate.PersistentObjectException: detached entity passed to persist 에러 (0) | 2023.06.06 |
[JPA] StackOverflowError (0) | 2023.05.27 |