티스토리 뷰
엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다.
예를들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 그렇지 않을 때도 있다.
그럼 팀 엔티티를 필요할 때 조회하면 어떨까?
그러기 위해서 JPA는 엔티티가 실제 사용될 때까지 데이터베이스에서 조회를 지연하는 방법 즉, 지연로딩을 제공한다.
그럼 지연로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데
이것을 바로 프록시 객체라고 한다.
프록시 구조를 먼저 살펴보자.

프록시 클래스는 실제 클래스를 상속 받아서 만들어진다.
따라서 실제 클래스와 겉 모양이 같고 우리는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.
프록시 객체의 초기화 과정을 알아보자.
** 프록시 초기화 예제이다.
//MemberProxy 반환
Member member = em.getReference(Member.class, "id1");
member.getName();

1. 프록시 객체에 member.getName() 을 호출해서 실제 데이터를 조회한다.
2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하여 초기화한다.
3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다.
4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버 변수에 보관한다.
5. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.
그럼 프록시 객체는 언제 사용할까?
프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다.
지연 로딩에 대해서는 다른 페이지로 만나보자!
참고
자바 ORM 표준 JPA 프로그래밍 - 김영한
'Framework > Spring' 카테고리의 다른 글
[JPA] N + 1 문제 (0) | 2022.12.05 |
---|---|
[JPA] 즉시로딩과 지연로딩 (0) | 2022.11.14 |
[JPA] 양방향 연관관계 매핑 (0) | 2022.10.26 |
[JPA] 플러시 (0) | 2022.10.25 |
[JPA] 패러다임 불일치 (0) | 2022.10.24 |
- Total
- Today
- Yesterday
- spring boot
- 자동구성
- 정적변수
- nginx
- 오블완
- 고정 세션
- nosql
- Caching
- java
- Load Balancer
- 다중화
- HashMap
- JPA
- @conditional
- 티스토리챌린지
- AutoConfiguration
- Sticky Session
- fail-fast
- 인터페이스
- 로드 밸런서
- 인스턴스변수
- HashSet
- syncronized
- object
- Security
- fail-safe
- 추상클래스
- Hash
- Red-Black Tree
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |