해결된 질문
작성
·
51
1
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
안녕하세요 영한 님 강의를 들으며 공부하던 중 findAll 메서드를 통해 가져온 List<Member> members의 각 Member들이 team 필드에 프록시 객체를 들고 있다고 말씀하셨는데, 해당 프록시 객체의 값을 디버깅해 본 결과 그 안에 이미 값이 존재 했습니다. console을 확인해보니 아직 db에 쿼리를 날리기 전인데(쿼리를 날리기 전인지 p6spy에 들어오기 전인지는 확인하지 못한 점 죄송합니다.) members의 각 Member들의 team필드에 프록시 객체가 존재하지만 그 안에 이미 team의 값이 들어있는데 em.clear()를 통해 영속성콘텍스트마저 비워줬는데 어떻게 이미 알고 있는 건가요?
답변 2
0
-1
안녕하세요, 인프런 AI 인턴입니다. Matthew C님.
하이버네이트 프록시 객체에 대한 질문은 JPA 사용 시 종종 혼란을 일으키는 부분 중 하나입니다. 프록시는 실제 엔티티를 대신하여 사용되는 객체로, 지연 로딩을 지원하기 위해 사용됩니다. 하지만, 특정 상황에서는 프록시 객체가 아닌 실제 엔티티가 반환될 수 있습니다.
프록시 객체가 값이 존재하는 이유는 여러 가지가 있을 수 있습니다:
이전 쿼리 결과의 캐싱: 프록시는 엔티티가 이미 영속성 컨텍스트 내에 존재하고 있는 경우에는 실제 객체를 반환합니다. em.clear()
가 호출된 이후라면 프록시 객체를 호출할 때마다 새로운 쿼리를 수행하게 되어야 하지만, 캐싱이나 다른 설정으로 인해 이미 관련 정보를 메모리상에서 가지고 있을 수 있습니다.
즉시 로딩(Eager Loading)의 설정: 엔티티의 매핑 설정에 따라 관계가 Eager 로딩으로 정의된 경우, 엔티티가 로드될 때 연관된 엔티티도 함께 로드됩니다.
디버깅 툴의 특성: 디버깅 툴은 객체를 시각적으로 표현하기 위해 내부 데이터를 프록시 초기화 없이도 보여줄 수 있습니다. 이와 같은 디버깅 도구의 특성상 값이 이미 세팅되어 있는 것처럼 보이게 할 수 있습니다.
엔티티 그래프 사용: 엔티티 그래프를 통해 결과를 가져오는 경우에도 프록시 객체가 아닌 실제 엔티티가 반환될 수 있습니다.
위 상황 중 하나인지 확인하기 위해서, 추가적인 디버깅 또는 로그 분석이 필요할 수 있습니다. 특히 p6spy
로그를 통해 실제로 어떤 쿼리가 DB로 날아가는지 확인하는 것이 도움이 될 것입니다.
프록시와 관련하여 더 많은 정보를 얻고 싶으시면 아래의 링크들을 참고하세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. Matthew C님
디버깅을 하면 디버깅 툴에서 해당 객체를 로딩할 수 있습니다 🙂
감사합니다.