JPA 프록시

김두현·2023년 4월 29일
1

JPA

목록 보기
10/14
post-thumbnail

Goal

  • Proxy의 개념을 파악한다.
  • 프록시 객체의 초기화 과정을 이해한다.
  • 프록시의 특징을 파악한다.

Proxy

  • 프록시 객체란, 실제 객체와 겉 모양은 같으나 실제 객체를 대신하여 동작하는 객체를 의미한다.
    • 실제 클래스를 상속받아서 만들어지며, 실제 객체의 참조(target)를 보관한다.

em.find() vs em.getReference()

  • em.find() : DB를 통해 실제 엔티티를 조회한다.
  • em.getReference() : DB 조회를 미루고 프록시 엔티티를 조회한다.

  • 아래와같이 동일한 객체가 아님을 알 수 있다.


프록시 객체의 초기화

프록시 객체는 참조하는 실제 객체에 접근하는 시점에 초기화된다.

  • 프록시 객체가 초기화되면, 프록시 객체를 통해 실제 엔티티 객체에 접근이 가능하다. 즉, 실제 엔티티로 바뀌는 것이 아니다.

  • 아래는 프록시 객체의 초기화 과정이다.

프록시의 특징

  • 프록시 객체는 처음 사용되는 시점에 한 번만 초기화된다.

  • 초기화를 통해 실제 엔티티로 바뀌는 것이 아닌, 초기화를 통해 실제 엔티티에 접근이 가능해진다.

  • 프록시 객체와 실제 엔티티에 대한 비교는 == 이 아닌 instance of로 한다.

  • 영속성 컨텍스트에 찾는 엔티티가 이미 존재하면, em.getReference()를 호출해도 실제 엔티티를 반환한다.

  • 엔티티가 준영속 상태라면, 프록시를 초기화 할 수 없다.
    • org.hibernate.LazyInitializationException 예외가 발생한다.

그래서, 프록시를 언제 어디에서 써?


참고 자료

https://www.inflearn.com/course/ORM-JPA-Basic


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글