본문 바로가기
JPA/Core

JPA 프록시 (for 지연 로딩)

by BAYABA 2021. 10. 10.
  1. 개인 공부 목적으로 작성하였습니다.
  2. 아래 출처를 참고하여 작성하였습니다.

목차

  1. Intro
  2. 프록시 기초
  3. 프록시 특징
  4. 프록시 객체의 초기화 과정

1. Intro

  1. JPA의 프록시 객체에 대해 알아보겠습니다.

2. 프록시 기초

  1. 프록시란 하이버네이트가 강제로 만든 가짜 클래스를 의미합니다.
  2. JPA에서는 em.find()말고, em.getReference()라는 메서드가 있습니다.
  • em.find() 는 DB를 통해서 실제 엔티티 객체를 조회하는 메서드입니다.
  • em.getReference() 는 DB 조회를 미루는 가짜(프록시) 엔티티 객체를 조회하는 메서드입니다.
  • 즉, em.getReference()로 멤버를 조회하면, 실제로 필요한 시점에 데이터베이스에 쿼리가 나갑니다.

3. 프록시 특징

  1. 실제 클래스를 상속 받아서 만들어집니다.
  • 하이버네이트가 내부적으로 상속받아서 만듭니다.
  • JPA에서는 프록시를 생성을 위해서 기본 생성자를 반드시 하나 생성해야합니다. 이때 접근 권한은 protected
  1. 프록시 객체는 실제 객체의 참조를 보관합니다.
  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출합니다.
  • 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됩니다.

4. 프록시 객체의 초기화 과정

  1. em.getReference()로 프록시 객체를 가져온 다음에 getName() 메서드를 호출하면, MemberProxy 객체에는 target 값이 존재하지 않습니다.
  2. 그러면 JPA가 영속성 컨텍스트에 초기화 요청을 합니다.
  3. 그러면 영속성 컨텍스트가 DB에서 조회해서 실제 Entity를 생성해줍니다.
  4. 그리고 프록시 객체가 가지고 있는 target(실제 Member)의 getName()을 호출해서 결국 member.getName()을 호출한 결과를 받을 수 있습니다.
  5. 프록시 객체에 target이 할당 되고 나면, 더이상 프록시 객체의 초기화 동작은 없어도 됩니다.

출처

  1. [JPA] 프록시란?
  2. 실무에서 Lombok 사용법

'JPA > Core' 카테고리의 다른 글

EntityManager  (0) 2021.10.13
JPA Auditing 기능  (0) 2021.10.10