일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 자바
- 라이엇 API
- 알고리즘
- java
- 올리브영 고객센터
- already use
- DFS
- 리코쳇로봇
- 멋쟁이사자차럼
- 백준
- 최주호
- BFS
- 스프링부트
- 포트 죽이는법
- 테크잇
- 전적 검색
- 스프링 입문을 위한 자바 객체 지향의 원리와 이해
- 더티체킹
- 영속성
- 백엔드 스쿨3기
- 인프런
- 시소 짝꿍
- 카카오2023신입공채
- JPA
- 김영한
- 엔에첸
- 프로그래머스
- 인텔리제이 에러
- 자바ORM표준JPA프로그래밍
- 조회수중복
Archives
- Today
- Total
My Blog
프록시의 초기화 과정 본문
프록시객체는 JPA에서 지연로딩일 때 사용되는 것이다.
예를 들어보자
회원 엔티티에
@ManyToOne
private Team team 이라는 필드가 있다.
만약 이 메소드에서
public void print(String memberId){
Member member = em.find(Member.class, memberId);
Team team = member.getTeam();
System.out.println(member.getUsername());
System.out.println(team.getName());
}
여기서는 한 멤버를 조회하고 멤버와 연관된 팀을 조회한다.
반면에 이 메소드에서는
public void print(String memberId){
Member member = em.find(Member.class, memberId);
System.out.println(member.getUsername());
}
회원을 조회하고 연관된 팀까지 조회가 됐는데 이것은 효율적이지 않다는 것이다.
그래서 JPA에서는 프록시를 지원하는데
프록시의 기초 내용은 이렇다.
한 회원을 조회할 때 연관된 것은 프록시 객체를 생성해 실제 객체에 대한 참조(target)를 보관한다. 그리고 프록시 객체의 메소드를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.
즉 한 회원을 조회할 때 연관된 것을 프록시 객체로 생성해 놓고 그 연관된 것이 실제로 getName과 같이 사용될 때 프록시 객체는 그 객체에 대한 정보를 위임하는 것이다.
그럼 프록시 객체의 초기화는 어떻게 이루어 질까?
1. member.getName()을 호출해서 실제 데이터를 조회한다.
2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하는데 이것을 초기화 라고 한다.
3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다.
4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버변수에 보관한다.
5. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.
728x90
'스프링부트 > 스프링부트 인프런 김영한님' 카테고리의 다른 글
즉시로딩 지연로딩 실제 차이 (0) | 2023.06.10 |
---|---|
스프링부트 영속성 전이 에러 (0) | 2023.06.08 |
즉시 로딩과 지연 로딩 (0) | 2023.05.29 |
스프링 빈과 의존관계 (0) | 2023.01.14 |
Assertions 테스트 (0) | 2023.01.13 |
Comments