[JPA] Proxy & Lazy Loading

한호성·2023년 2월 9일
0

글의 목적

JPA의 Lazy loading 에 사용되는 Proxy에 대해 정리하는 글 입니다.

용어정리

프록시 ( Proxy )

프록시의 기본적인 개념만 알고 JPA 연관관계에서의 Proxy의 활용에 대해 이해해보자.

프록시란 대신 이라는 의미를 가지고 있다. 프로토콜에 있어서 대리 응답 등에 사용하는 개념. 보안상의 문제로 직접 주고 받을 수 없는 사이에서 프록시를 이용해서 중계 하는 개념이다.

(중계 서버 == 프록시 서버)

프록시 서버를 사용했을 때 장점 
- 개인 정보를 보호할 수 있다. 프록시 서버 없이 클라이언트가 
서버에 요청 시 본인의 ip 주소가 노출되는데, 
프록시 서버를 사용 시 서버측에서 나의 IP가 아닌 프록시 서버의 IP를 보게 된다.

- 캐시를 사용해서 속도가 향상된다. 프록시 서버는 같은 요청이 들어오면
Cache 자원을 반환 하여 서비스의 속도를 높이고 대역폭도 줄일 수 있다.

JPA 에서의 프록시 ( Proxy )

JPA 구현체인 Hibernate가 지연 로딩을 위해 사용하는 것이 JPA의 Proxy 객체이다. 데이터베이스 관계를 객체지향으로 나타내고, 효율적으로 데이터를 불러오기 위해서 사용하는 방식이 Lazy 모드의 Proxy 객체이다.

#cf) 프록시의 개념은 하이버네이트 뿐만 아니라 다양한 곳에서 사용되는 개념이다.

그렇다면 Lazy 모드에서 연관관계가 Class - Member인 객체 두개가 있다고 생각해보자.

Member 가 객체가 속한 Class 정보를 얻고 싶을 때,
Class 정보를 Member 객체 조회할 때 가져오는 것이 아니라 Proxy 객체를 채워둔 후, Class 정보를 직접 조회할 때,그 때에 DB에 쿼리를 날려서 정보를 가져오는 방식이다.

정리해보면


1. Member 객체 조회시, proxy객체로 class field를 채워둠
2. Class 정보를 Service 단에서 조회
3. 조회시, DB에 쿼리를 보내 해당하는 Class 정보를 가져온다.

그렇다면 Proxy 객체는 무엇일까?

Proxy 객체

프록시는 실체 객체의 상속본이다.
그렇기 때문에 실체 객체처럼 동작을 할 수 가 있다. 프록시 객체는 실체 객체에 대한 참조를 보관하여, 프록시 객체의 메서드를 호출 했을 때, 실제 객체의 메서드를 호출한다. 이러한 특징을 갖기 위해서는 JPA Entity의 생성자의 접근제어자는 protected 보다 같거나 넓은 범위의 접근제어자를 가져야 하며, final로 정의할 수 없다

프록시 객체를 초기화 할 때, 영속성 컨텍스트의 관리를 받지 못한경우, LazyInitializationException 이 발생한다. 프록시가 영속상태여야 한다는 것 늘 생각하자

지연로딩을 사용하면, resource 를 활용하는데 있어서 많은 이점이 있다. 그에 따라 proxy 객체를 사용하여서 많은 버그, 문제점을 일으키기 때문에 개념을 잘 이해하고 있는것이 중요하겠다.

프록시 객체의 초기화 및 동작방식 (Hibernate 구현체의 방식)

1. 프록시 객체에 유저 정보 요청
2. 영속성 컨텍스트에 초기화 요청 
3. db조회
4. 실제 entity의 참조값을 통해 정보들 조회 가능하게 됨

#cf) 영속성 컨텍스트를 기반으로 한다는 것이 포인트!!

Reference

김영한님의 JPA_ORM 강의
https://tecoble.techcourse.co.kr/post/2022-10-17-jpa-hibernate-proxy/

profile
개발자 지망생입니다.

0개의 댓글

관련 채용 정보