250x250
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 파이썬
- getreference
- 자료구조
- aws saa-c03
- 객체지향
- 다이렉트 레퍼런스
- 코딩테스트
- 딕셔너리
- 백준
- 파이썬 문자열 메서드
- 부트스트랩 클래스 로더
- AWS SAA-C03 합격후기
- Spring
- java
- 스프링 컨테이너
- python list method
- dfs
- 자바
- 어플리케이션 클래스 로더
- 컴포넌트 스캔
- 심볼릭 레퍼런스
- 플랫폼 클래스 로더
- stop the world
- python
- 클래스 로더 계층
- 2026 AWS SAA-C03
- 파이썬 리스트 메서드
- 알고리즘
- 스프링
- BFS
Archives
- Today
- Total
클라우드 낚시꾼
[JPA] JPA 프록시 개념 (getReference) 본문
728x90
1. find()와 getReference() 소개

- em.find(): 데이터베이스에서 엔티티 데이터를 즉시 로드한다. (즉시 로딩)
- em.getReference(): 프록시 인스턴스를 제공하고 실제 엔티티 데이터의 로딩을 필요할 때까지 지연시킨다. (지연 로딩)
예제 코드
@Entity
public class Member {
@Id
private Long id;
private String name;
// getters and setters
}
EntityManager em = entityManagerFactory.createEntityManager();
// find() -> 즉시 로딩
Member member1 = em.find(Member.class, 1L);
// getReference() -> 지연 로딩
Member member2 = em.getReference(Member.class, 1L);
2. 프록시 특징

- 프록시 객체는 EntityManager의 getReference() 메소드를 통해 생성된다. 이 객체는 실제 엔티티 데이터를 담고 있지 않고, 실제 클래스를 상속받은 프록시 클래스의 인스턴스이다.
- 프록시 객체에 대한 첫 접근이 발생할 때, JPA는 필요한 데이터를 데이터베이스에서 로드하여 프록시 객체를 초기화한다.
- 프록시 객체는 실제 객체의 참조(target)를 보관한다.
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출한다.
3. 프록시 초기화 및 동작

- 프록시는 실제 엔티티를 대신하여 사용된다.
- 프록시 뒤의 실제 엔티티는 엔티티의 속성에 접근할 때까지 로드되지 않는다.
- 프록시는 실제 엔티티가 로드되면 호출을 실제 엔티티에 위임한다.
- 엔티티 클래스 메소드가 프록시에서 호출될 때, 먼저 엔티티가 로드되었는지 확인한다. 그렇지 않다면 데이터베이스에서 엔티티를 가져옵니다.
// 프록시 위임
// ID는 이미 알려져 있기 때문에 프록시를 초기화하지 않습니다.
member2.getId();
// 'name'은 프록시의 초기 데이터에 포함되지 않기 때문에 데이터를 로드하고 프록시를 초기화합니다.
member2.getName();
4. 결론
EntityManager em = entityManagerFactory.createEntityManager();
Member member = em.getReference(Member.class, "id1");
String memberName = member.getName(); // 'name'에 접근하면 DB 로드가 트리거됩니다.
- getReference()는 find()와 달리 DB에서 즉시 전체 엔티티를 로드할 필요가 없이 지연로딩이 가능하다.
- 프록시를 사용함으로써, JPA는 식별자만 필요한 경우 전체 엔티티를 로드하는 비용을 피할 수 있습니다.
- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.
728x90
'BE Framework > JPA' 카테고리의 다른 글
| [JPA] 일대다 관계 VS 다대일 관계 (단방향, 양방향, 연관관계의 주인) (0) | 2024.05.03 |
|---|---|
| [JPA] @JoinColumn과 mappedBy: 연관관계의 주인은? (1) | 2024.05.01 |