JPA
프록시를 아라보자
winwin-k9
2024. 2. 3. 17:04
프록시
em.find()는 데이터베이스를 통해 실제 엔티티를 조회하는 것.
em.getReference()는 데이터베이스 조회를 미루는 프록시 엔티티 객체 조회
- 즉, DB에 쿼리가 날아가지 않고 조회
- 조회시에는 쿼리가 날아가지 않고, 그 값을 사용할 때 쿼리를 날리게 된다.
프록시는 진짜 객체를 상속받아 만들어지고, 내부에 targer을 두어 가리킨다.
진짜 객체의 값이 필요해지면 영속성 컨텍스트에 값을 요청하고 → 영속성 컨텍스트는 진짜 값을 조회하기 위해서 DB를 조회하고 → 실제 엔티티를 생성하여 target이 이를 가리키도록 하여 실제 값을 가져올 수 있다.
프록시의 특징
- 프록시 객체는 처음 사용할 때 한 번만 초기화
- 처음 한 번만 초기화하면 target에 값이 채워져, target에 값이 있을 때부터는 바로 5번(초기화 과정 5번)을 실행한다.
- 즉, DB에 쿼리를 또 날리지 않는다.
- 프록시 객체를 초기화할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능
- 프록시 객체를 초기화하고 getClass를 해봐도 그대로 프록시 객체임
- 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크 시 주의해야 함
- 원본 엔티티와 ==를 하면 비교 실패할 수가 있기 때문에 instance of를 사용
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해 도 실제 엔티티 반환
728x90