• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

프록시와 연관관계 관리-프록시 질문있습니다.

24.05.05 13:00 작성 24.05.05 14:01 수정 조회수 56

0

초기화 프록시.pngrefMember.getUsername()을 하면 프록시가 초기화 된다고 하셨는데요. em.detach나 em.clear가 영속상태에서 준영속상태로 바껴야지 초기화인데 단순히 get만 호출한건데 준영속으로 바뀔수가 있나요?

 

즉시 로딩과 지연 로딩

3분 16초 m.getTeam().getName()이부분이 프록시라고 하셨는데 이부분만 보고 프록시인지 아닌지 어떻게 알아요?

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.05.05

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

refMember.getUsername()을 하면 프록시가 초기화 된다고 하셨는데요. em.detach나 em.clear가 영속상태에서 준영속상태로 바껴야지 초기화인데 단순히 get만 호출한건데 준영속으로 바뀔수가 있나요?

준영속 상태와 프록시 초기화는 서로 다른 얘기입니다. 말씀하신 것처럼 준영속 상태는 영속성 컨텍스트에서 관리중이던 엔티티 객체가 em.detach()나 em.clear() 등으로 인해 영속성 관리를 받지 못하는 상태가 된 것을 의미합니다.

프록시는 기본적으로 영속 상태입니다. getReference()를 하면, 실제 엔티티 객체를 불러오지 않고 프록시(대리자) 객체를 조회해옵니다. 하지만 실제 엔티티 객체의 데이터를 사용하고자 할 때, 프록시 초기화를 통해 실제 엔티티 데이터를 조회해오는 것입니다! 해당 내용은 다시 복습해보시는 것을 추천합니다 🙂

즉시 로딩과 지연 로딩

3분 16초 m.getTeam().getName()이부분이 프록시라고 하셨는데 이부분만 보고 프록시인지 아닌지 어떻게 알아요?

 

image위의 오른쪽 그림과 같이 Member 엔티티에서 Team에 대한 연관관계를 세팅해줬습니다!

보시면 FetchType.LAZY 로 연관관계를 세팅해주신 것을 보실 수 있습니다. 이는 지연 로딩을 하겠다는 것으로 이렇게 하면 fetch join 등을 사용해서 한꺼번에 불러오지 않는 이상 기본적으로 team은 프록시 객체로 불러오게 됩니다. 그래서 영한님은 당연히 프록시 객체로 왔다는 것을 가정하고 설명해주시고 계신 것입니다!

 

 

감사합니다.

zzzzz님의 프로필

zzzzz

질문자

2024.05.05

프록시 16분 20초에서 나오는 그림 5번에서 가지고 오는걸로 이해해도 되나요?

y2gcoder님의 프로필

y2gcoder

2024.05.05

넵 그런식으로 Team 프록시 객체의 초기화도 이해하시면 될 것 같습니다 🙂

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.05

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

zzzzz님의 질문은 프록시 객체와 관련된 내용과 해당 객체의 준영속 상태에 대한 이해를 요청하는 것으로 보입니다. 특히, getReference() 메서드로 가져온 프록시 객체가 getUsername() 메서드 호출을 통해 초기화되는 과정과 이 과정에서의 영속성 상태 변화에 대한 궁금증을 가지고 계신 것 같습니다.

프록시 객체의 초기화는 객체에 처음 접근하는 시점에 데이터베이스로부터 실제 엔티티 데이터를 로드하는 것을 말합니다. 여기서 중요한 점은 em.clear()em.detach()를 사용하는 것이 아니라, 프록시 객체에 실제 데이터가 필요한 경우 (예를 들어, getUsername()으로 데이터를 요청하는 경우)에 JPA가 자동으로 해당 데이터를 데이터베이스에서 가져오면 프록시 객체가 ‘초기화’되는 것입니다.

말씀하신 준영속 상태는 엔티티 관리자가 더 이상 해당 엔티티를 관리하지 않는 상태를 의미합니다. detach()clear() 메서드를 통해 영속성 컨텍스트에서 엔티티를 제거하면, 이 엔티티는 준영속 상태가 됩니다. 하지만 이와 별개로, 프록시 객체의 초기화는 영속 상태에서 필요한 데이터를 처음으로 로드할 때 발생하며, 준영속 상태 변환과는 별도의 과정입니다.

참고하실 수 있는 기존 답변 링크를 드립니다:
- 프록시 객체가 준영속 상태일 때 질문입니다 - 답변에서는 프록시 객체가 준영속 상태일 때와 관련한 설명이 포함되어 있습니다. 프록시 객체 초기화와 준영속 상태에 대한 이해를 돕는 내용입니다.

이 링크들은 프록시 객체가 초기화되는 과정과 준영속 상태에 대한 이해를 더 깊게 할 수 있도록 도와줍니다.

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