본문 바로가기
개발/JPA

[JPA] 프록시

by Allonsy 2022. 4. 6.
반응형

entityManager.find()

데이터베이스 조회를 통해 실제 엔티티 객체 반환

 

entityManager.getReference()

데이터베이스 조회를 통하지 않고 프록시 엔티티 객체 반환

실제 사용시에 DB를 조회해서 실제 Entity 생성(프록시 객체 초기화) ex. member.getUsername()

 

# 프록시 특징

- 실제 클래스를 상속 받아서 만들어짐

- 실제 클래스와 겉모양이 같음

- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨

- 프록시 객체는 실제 객체의 참조(target)를 보관

- 프록시 객체 호출하면 실제 target의 메소드 호출

- 처음 사용할 때 한 번만 초기화

- 프록시 객체 초기화 : 프록시가 실제 엔티티가 되는 것이 아니라 실제 엔티티(target)에 접근 가능해짐

- 프록시 객체는 원본 엔티티 상속 받음

   실제 엔티티와 프록시 객체는 == 비교 시 false. instance of 로 비교해야함

- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 entityManager.getReference()를 호출해도 실제 엔티티 반환

★ find(), getReference() : 엔티티에 처음 담긴 값을 반환

처음에 실제 엔티티 객체가 담겼으면 실제 엔티티 객체를, 프록시 객체가 담겼으면 프록시 객체를 반환

하나의 엔티티에 대해 동일성을 보장해줘야하기 때문에!

 org.hibernate.LazyInitializationException: could not initialize proxy

준영속 상태일 때 프록시를 초기화하면 예외 발생

(영속성 컨텍스트의 도움을 받을 수 없음. 트랜잭션 끝났을때, entityManager.clear(), entityManager.detach(entity))

 

# 프록시 확인

- 프록시 인스턴스 초기화 여부 확인

PersistenceUnitUtil.isLoaded(Object entity)

- 프록시 클래스 확인 방법

entity.getClass().getName()

- 프록시 강제 초기화(하이버네이트 제공)

org.hibernate.Hibernate.initialize(entity);

(참고) JPA 표준은 강제 초기화 없음 member.getName()으로 초기화해야함

 

 

인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한 강사님) 강의를 수강하며 정리한 글입니다 :)

반응형

댓글