inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

프록시

프록시 객체 초기화 중 질문있습니다.

해결된 질문

530

gorany

작성한 질문수 5

5

안녕하세요 영한님! 강의 내용 중 궁금한 점이 있어 질문 드립니다.

Team refTeam = em.getReference(Team.class, 1L);
refTeam.getName();

을 하게되면 Proxy가 비어있으므로

1. 영속성 컨텍스트에 초기화 요청을 보내고,

2. 영속성 컨텍스트가 DB를 조회해

3. 실제 엔티티 객체를 생성

은 이해가 되었습니다.

그럼 여기서 영속성 컨텍스트가 실제 엔티티 객체를 생성하고 Proxy의 target에 연결을 해줄 뿐이지,  1차 캐시에 실제 엔티티가 저장되는 것은 아닌 건가요? 1차 캐시에는 'Proxy 객체만' 있고 Proxy의 target을 통해 실제 엔티티를 접근할 수 있는 건지 궁금하여 질문 드립니다!

감사합니다.

java JPA

답변 2

6

David

안녕하세요. gorany님, 공식 서포터즈 David입니다.
.

1. 영속성 컨텍스트는 먼저 1차 캐시에 저장 후 영속상태의 엔티티를 반환합니다. 

2. 1차 캐시에는 프록시 객체가 아닌 엔티티가 들어있습니다.

getReference()할 때 proxy 객체를 받았고, getName()할 때 영속성 컨텍스트에 엔티티가 없으면 조회한 뒤 1차캐시에 엔티티를 저장하고 proxy의 target에는 엔티티의 참조가 들어가게 됩니다.

.
감사합니다.

1

David

영속성 컨텍스트에 Proxy를 담고 있는 Map이 있습니다. Key는 Enity의 id를 사용하고요.

.

1. em.getReference(Member.class, 1L)를 하게 되면 내부에 프록시가 있는 확인합니다.

2. 프록시가 없으면 프록시를 생성하고 반환합니다. 이 과정에서 영속성 컨텍스트는 프록시를 따로 보관하는 맵에 생성된 프록시를 Key(member의 id)와 함께 담습니다.

3. 두 번째로 em.find(Member.class, 1L)를 명령하면 엔티티를 반환하기 전에 프록시를 먼저 찾습니다. em.reference() 명령 때 만들어두었던 프록시가 있기 때문에 프록시를 반환합니다.

.

0

gorany

오.. 이런 내부구조가 있었군요 완전히 이해되었습니다! 친절한 설명 너무 감사드립니다. :)

0

gorany

답변 감사드립니다! 제가 잘못 이해하고 있던 부분인 것 같습니다.

Entity entity = getReference(...)

-> 영속성 컨텍스트에 Proxy 저장

-> entity에 Proxy 반환

으로 생각하고 있었는데 getReference() 호출 시,

1. 영속성 컨텍스트에서 값이 있는지 확인 (있다면 그것을 반환)

2. 없다면 Proxy 객체를 반환 (이 때 영속성 컨텍스트에는 아무것도 저장되지 않음)

3. entity.getName()으로 Proxy 초기화 시, 이때 DB를 조회해 생긴 '실제 엔티티가 1차 캐시에 저장'되고, 실제 엔티티를 Proxy의 target이 참조

라고 이해하면 될까요?

만약 그렇다면... 조금 주제를 벗어난 질문이지만,

Q. 동일한 영속성 컨텍스트에서, '다시 동일한 데이터를 find() 해도 Proxy를 반환해준다' 하셨는데 JPA는 어떻게 Proxy를 먼저 반환했던 것을 기억하고 Proxy를 반환해주는 것 인지 궁금합니다.

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

27

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

46

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

93

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

93

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

114

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1