- 개인 공부 목적으로 작성하였습니다.
- 아래 출처를 참고하여 작성하였습니다.
목차
- Intro
- 프록시 기초
- 프록시 특징
- 프록시 객체의 초기화 과정
1. Intro
- JPA의 프록시 객체에 대해 알아보겠습니다.
2. 프록시 기초
- 프록시란 하이버네이트가 강제로 만든 가짜 클래스를 의미합니다.
- JPA에서는 em.find()말고, em.getReference()라는 메서드가 있습니다.
- em.find() 는 DB를 통해서 실제 엔티티 객체를 조회하는 메서드입니다.
- em.getReference() 는 DB 조회를 미루는 가짜(프록시) 엔티티 객체를 조회하는 메서드입니다.
- 즉, em.getReference()로 멤버를 조회하면, 실제로 필요한 시점에 데이터베이스에 쿼리가 나갑니다.
3. 프록시 특징
- 실제 클래스를 상속 받아서 만들어집니다.
- 하이버네이트가 내부적으로 상속받아서 만듭니다.
- JPA에서는 프록시를 생성을 위해서 기본 생성자를 반드시 하나 생성해야합니다. 이때 접근 권한은 protected
- 프록시 객체는 실제 객체의 참조를 보관합니다.
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출합니다.
- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됩니다.
4. 프록시 객체의 초기화 과정
- em.getReference()로 프록시 객체를 가져온 다음에 getName() 메서드를 호출하면, MemberProxy 객체에는 target 값이 존재하지 않습니다.
- 그러면 JPA가 영속성 컨텍스트에 초기화 요청을 합니다.
- 그러면 영속성 컨텍스트가 DB에서 조회해서 실제 Entity를 생성해줍니다.
- 그리고 프록시 객체가 가지고 있는 target(실제 Member)의 getName()을 호출해서 결국 member.getName()을 호출한 결과를 받을 수 있습니다.
- 프록시 객체에 target이 할당 되고 나면, 더이상 프록시 객체의 초기화 동작은 없어도 됩니다.
출처
'JPA > Core' 카테고리의 다른 글
EntityManager (0) | 2021.10.13 |
---|---|
JPA Auditing 기능 (0) | 2021.10.10 |