작성
·
65
답변 4
0
0
원래의 질문과 아래 추가 질문에 대해 지식 공유자님의 답변도 부탁드립니다.
https://www.inflearn.com/community/questions/264414 이 질문글의 David님 답변에서
1차 캐시에는 프록시 객체가 아닌 엔티티가 들어있습니다.
이건 무슨 의미인지 알 수 있을까요?
근데 또 의문이 드는 게 수업에서 em.detach
를 통해 프록시 객체를 준영속 상태로 바꾸기도 하지 않았나요?
그럼 프록시 객체도 영속화 된다고 보는게 맞을거 같은데..
이에 대해 정리 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다. 조태준님.
질문하신 부분에 대해 설명드리겠습니다.
JPA에서 getReference()
는 프록시 객체를 반환합니다. 프록시 객체는 실제 데이터베이스 쿼리를 지연하여 필요한 시점에 데이터를 가져오는 역할을 합니다. 따라서, getReference()
로 엔티티를 조회하면 해당 프록시 객체가 영속성 컨텍스트에 저장됩니다.
getReference()
를 사용한 경우: 영속성 컨텍스트에 프록시 객체가 저장됩니다. 이 프록시 객체는 필요 시점에 실제 데이터베이스 쿼리를 통해 엔티티를 초기화합니다.find()
를 사용한 경우: 실제 엔티티 객체가 즉시 조회되어 영속성 컨텍스트에 저장됩니다.따라서, 트랜잭션 안에서 getReference()
로 조회한 엔티티는 처음부터 끝까지 프록시 객체로 남아 있다가, 실제로 데이터가 필요할 경우 초기화 과정이 필요할 수 있습니다. 반면, find()
로 조회한 엔티티는 처음부터 실체 데이터를 가지고 있는 일반 객체로 유지됩니다.
이와 관련된 내용에 대한 유사한 질문과 답변이 있으니 아래 링크를 참조해 보시길 추천드립니다:
- JPA - em.getReference() 이후 em.find() 호출 시 객체 상태
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
https://www.inflearn.com/community/questions/354216
해당 질문글까지 참고하였는데 제가 이해한 바가 맞는지 확인 부탁드립니다.
getReference()
를 통해 가져 온 프록시 객체는 영속성 컨텍스트에 담기지만 1차 캐시에 담기는 것은 아니다.실제 객체(엔티티)만 1차 캐시에 담긴다.
1차 캐시에 담긴 애들만 영속화 된다고 본다.
만약 위 내용이 맞다면
영속성 컨텍스트와 1차 캐시를 거의 같은 거라고 보고있었는데 이러한 경우 때문에
완전히 같다고는 못하는 건가요?