인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Matthew C님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

@EntityGraph

하이버네이트 프록시객체 질문

해결된 질문

작성

·

49

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()를 통해 영속성콘텍스트마저 비워줬는데 어떻게 이미 알고 있는 건가요?

image.png

 

답변 2

0

Matthew C님의 프로필 이미지
Matthew C
질문자

1, 2, 4는 확인해 본 결과 아니었고. 3은... IntelliJ 얼티밋 버전 사용중인데.. 그런 기능이 있나요...?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Matthew C님

디버깅을 하면 디버깅 툴에서 해당 객체를 로딩할 수 있습니다 🙂

감사합니다.

-1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. Matthew C님.

하이버네이트 프록시 객체에 대한 질문은 JPA 사용 시 종종 혼란을 일으키는 부분 중 하나입니다. 프록시는 실제 엔티티를 대신하여 사용되는 객체로, 지연 로딩을 지원하기 위해 사용됩니다. 하지만, 특정 상황에서는 프록시 객체가 아닌 실제 엔티티가 반환될 수 있습니다.

프록시 객체가 값이 존재하는 이유는 여러 가지가 있을 수 있습니다:

  1. 이전 쿼리 결과의 캐싱: 프록시는 엔티티가 이미 영속성 컨텍스트 내에 존재하고 있는 경우에는 실제 객체를 반환합니다. em.clear()가 호출된 이후라면 프록시 객체를 호출할 때마다 새로운 쿼리를 수행하게 되어야 하지만, 캐싱이나 다른 설정으로 인해 이미 관련 정보를 메모리상에서 가지고 있을 수 있습니다.

  2. 즉시 로딩(Eager Loading)의 설정: 엔티티의 매핑 설정에 따라 관계가 Eager 로딩으로 정의된 경우, 엔티티가 로드될 때 연관된 엔티티도 함께 로드됩니다.

  3. 디버깅 툴의 특성: 디버깅 툴은 객체를 시각적으로 표현하기 위해 내부 데이터를 프록시 초기화 없이도 보여줄 수 있습니다. 이와 같은 디버깅 도구의 특성상 값이 이미 세팅되어 있는 것처럼 보이게 할 수 있습니다.

  4. 엔티티 그래프 사용: 엔티티 그래프를 통해 결과를 가져오는 경우에도 프록시 객체가 아닌 실제 엔티티가 반환될 수 있습니다.

위 상황 중 하나인지 확인하기 위해서, 추가적인 디버깅 또는 로그 분석이 필요할 수 있습니다. 특히 p6spy 로그를 통해 실제로 어떤 쿼리가 DB로 날아가는지 확인하는 것이 도움이 될 것입니다.

프록시와 관련하여 더 많은 정보를 얻고 싶으시면 아래의 링크들을 참고하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.