일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Proxy
- Data Structure
- 백준
- 파이썬
- design pattern
- mongoDB
- 운영체제
- Java
- IT
- react
- redis
- JavaScript
- C
- 알고리즘
- JPA
- MySQL
- 자료구조
- 디자인 패턴
- Kafka
- 컴퓨터구조
- OS
- spring webflux
- Spring
- MSA
- Algorithm
- Heap
- c언어
- Galera Cluster
- 네트워크
- 자바
Archives
- Today
- Total
시냅스
JPA 프록시 관련 정리 본문
프록시
- em.find()
- 데이터베이스를 통해서 실제 엔티티 객체 조회
- em.getReference()
- 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
- 데이터베이스에 조회가 필요할 때 필요한 시점에 조회한다.
- 데이터베이스에 쿼리가 실행이 되지 않았음에도 조회가 되는 것
- 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
- 프록시는 실제 클래스를 상속 받아 만들어져 겉 모양이 같다.
- 클라이언트는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨
- 프록시 객체는 처음 사용할 때 한 번만 초기화한다.
- 프록시 객체를 초기화 할 때 프록시 객체가 실제 엔티티로 바뀌는 것은 아니고, 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근 가능하다.
- 프록시 객체는 원본 엔티티를 상속 받는다, 따라서 타입 체크시 주의해야함
- 프록시 내부에는 실제 객체의 참조를 보관한다.
- 프록시 객체를 호출하면 프록시 객체는 객체의 메소드를 호출한다.
- 만약 proxy에 값이 없으면 영속성 컨텍스트에 요청해서 db에서 값 받아오고, 실제 entity생성하고, proxy에서 실제객체.getName() 과 같은 꼴로 호출함
- 만약 1차 캐시 찾을 수 있는 값이라면 1차 캐시에서 가져온다.
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 Em.getReference() 를 호출해도 실제 엔티티가 반환된다.
Member member1 = new Member();
member1.setUserName("hello");
em.persist(member1);
em.flush();
em.clear();
Member m1 = em.find(Member.class, member1.getId());
System.out.println("m1.getClass() = " + m1.getClass()); // 실제 객체
Member reference = em.getReference(Member.class, member1.getId());
System.out.println("reference.getClass() = " + reference.getClass()); // 실제 객체, 같은 영속성 컨텍스트에서 가져 옴
System.out.println("a == a: " + (m1 == reference)); // true
- 영속성 컨텐스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생된다
Member member1 = new Member();
member1.setUserName("hello");
em.persist(member1);
em.flush();
em.clear();
Member refMember = em.getReference(Member.class, member1.getId());
System.out.println("refMember = " + refMember.getClass()); // proxy
em.clear(); // 영속성 컨텍스트에서 연결 끊음
System.out.println("refMember.getUserName() = " + refMember.getUserName());
// 영속성 컨텐스트에서 유지 하지 않기 때문에 찾을 수 없음
- 프록시 인스턴스의 초기화 여부 확인
- PersistenceUnitUtils.isLoaded(Object entity)
- 프록시 클래스 확인 방법
- entity.getClass().getName()
'Java, Spring > JPA' 카테고리의 다른 글
JPA 값 타입 관련 정리 (0) | 2022.09.17 |
---|---|
JPA 즉시 로딩과 지연 로딩, 영속성 전이와 고아 객체 (0) | 2022.09.17 |
JPA MappedSuperclass 정리 (0) | 2022.09.17 |
JPA 상속관계 매핑 정리 (0) | 2022.09.17 |
JPA 연관관계 정리 (0) | 2022.09.16 |
Comments