작성
·
144
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
안녕하세요.
프록시 객체와 프록시 객체의 준영속화에 대한 내용이 제가 이해한게 맞을까요?
Member refMember = em.getReference(Member.class, 1L); 로 가져온 Member 프록시 객체는 1차 캐싱에 저장되어있음.
프록시 객체는 실제 Member 엔티티를 상속받아 Member 객체가 가진 메소드들을 가지고있고, null 상태인 실제 Member 객체를 필드로 가지고 있음.
Member 프록시 객체 내부의 메소드를 호출하면 그 때 영속성 컨텍스트에 진짜 엔티티(키 값이 1L인)를 호출해달라고 요청하고 DB에서 가져와서 실제 엔티티를 1차 캐시에 캐싱하고 프록시 객체 내부의 null 상태인 Member 객체 가져온 엔티티로 초기화.
준영속 상태일 때 프록시를 초기화 하면 왜 예외가 발생
결국 실제 DB에서 조회해온 엔티티는 1차 캐시에 캐싱되어 영속화 된 상태인데 프록시 객체를 준
영속화하면 캐시는 비워지고 프록시의 Member 필드가 참조하는 실제 엔티티도 없어지기 때문에 프록시가 참조할 곳이없어서 예외 발생.
2번의 경우 1번이 맞다는 전제하에 생각한 로직입니다.
만약 맞다면 프록시를 준영속 상태로 만들 때(em.detach()) 어떻게 프록시만 준영속화 했는데 1차 캐싱에 실제 엔티티도 지워지게 되는건가요??
답변 1
1
안녕하세요. 윤창호님
생각하신 내용이 맞습니다.
영속성 컨텍스트를 초기화 하거나, detach를 호출하게 되면 영속성 컨텍스트는 더는 해당 엔티티를 관리하지 않게 됩니다.
참고로 여기서 실제 엔티티가 지워지는 것은 아닙니다. 영속성 컨텍스트가 관리하는 참조가 제거된다고 생각하시면 됩니다. (영속성 컨텍스트 입장에서 관리하는 엔티티의 참조 제거)
감사합니다.
답변 감사합니다!