티스토리 뷰
앞서 Lazy Loading에 대해서 잠깐 언급하고 넘어간 적이 있다.
한번에 엔티티에 해당하는 모든 데이터를 가져오는 것이 아닌 필요할때(호출시) 가져온다는 로딩 방식이었다.
여기서 프록시라는 개념이 있다. 보통 IT쪽에서 프록시는 네트워크에서 많이 들어본 단어일 것이다.
JPA에서 프록시도 크게 다르지 않은 개념인 것 같다.
즉, 필요한 것으로 넘어가기 위한 중간 단계 역할의 객체를 놓는 것이다.
Lazy Loading을 보면 바로 객체를 가져오는 것이 아닌 프록시 객체를 가져온 뒤, 그 프록시 객체를 통해서 실제 엔티티에 접근하게 된다.
프록시와 실제 엔티티는 상속을 받은 구조이기 때문에 겉모양이 동일하다.
이러한 특징으로 사용자는 프록시와 실제 엔티티를 사용하는데에 다른점이 없이 사용 가능하다.
다음처럼 user(Clinet)가 필요한 값을 호출하게 될때, 그 객체가 만약 프록시 객체로 대체 되어 있는 상태라고 가정해보자.
그렇다면 우선 proxy객체는 요청한 값을 가지고 있는 지를 판단하게 된다.
만약 그 값을 가지고 있지 않다면 영속성 컨텍스트에 엔티티 생성을 요청하게 된다.
그 이후 영속성 컨텍스트는 실제 엔티티 객체를 생성하게 되고, 프록시는 생성된 실제 엔티티를 참조해 Client에게 요청받은 값을 반환해주게 된다.
프록시로 복잡한 구조를 주면 가지게 되는 이점이 몇가지 있다.
그 중 가장 큰 것으로는 한번에 객체를 모두 로딩하지 않아도돼서 메모리에서 이점을 보고 성능상에서도 이점을 보게 된다.
운영중인 관계형 DB라면 그 연관관계는 복잡할 것이다. 그 것을 한번에 받아온다는 것은 성능상으로 좋지 않다.
따라서 운영중인 DB에는 lazy loading을 통해서 연관관계를 맺어주는 것이 중요하다.
Member findMember4 = em.find(Member.class, 1L);
// 만약 비즈니스 로직상 team 정보가 필요없다면..
System.out.println("username = " + findMember4.getUsername());
// team을 출력해야 할때
System.out.println("team = " + findMember4.getTeam().getName());
Member member7 = new Member();
member7.setUsername("hello");
em.persist(member7);
em.flush();
em.clear();
// Member findMember5 = em.find(Member.class, member7.getId());
// 호출시점상에서는 쿼리가 나가지 않는다.
// 하지만 밑의 사용 시점에서 쿼리가 날아간다.
Member findMember5_1 = em.getReference(Member.class, member7.getId());
System.out.println("findMember = " + findMember5_1.getId());
System.out.println("findMember = " + findMember5_1.getUsername());
Member m1 = em.find(Member.class, member7.getId());
Member m2 = em.getReference(Member.class, member7.getId());
System.out.println("m1 == m2: " + (m1.getClass() == m2.getClass())); // false
System.out.println("m1 == m2: " + (m1 instanceof Member));
출처
인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편
'Back End > JPA' 카테고리의 다른 글
[JPA 기초] 5. 영속성 전이 & 임베디드 타입 (0) | 2022.10.25 |
---|---|
[JPA 기초] 3-1. @MappedSuperclass (0) | 2022.10.14 |
[JPA 기초] 3. 연관관계 맵핑 (0) | 2022.10.14 |
[JPA 기초] 2. Entity - DB 맵핑 (2) | 2022.10.04 |
[JPA 기초] 1. 영속성 컨텍스트 (0) | 2022.10.03 |
- Total
- Today
- Yesterday
- centos
- consumer
- KAFKA
- OS
- Data Engineering
- API
- cs
- spring boot
- Firebase
- broker
- rhel
- React
- K8S
- Java
- spring
- NextJS
- docker
- apache kafka
- Producer
- 리액트
- Linux
- logback
- feign client
- Front
- 프론트엔드
- zookeeper
- apache
- JPA
- frontend
- Container
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |