강의

멘토링

로드맵

Inflearn brand logo image

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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

프록시

프록시 객체의 초기화 부분에서

작성

·

43

0

안녕하세요. 강의 내용 15분쯤에 프록시 객체의 초기화 부분에서 설명해주신 부분이 잘 이해가 되지않아서 찾아보고 아래와 같이 정리해보았는데요. 이렇게 이해하는게 맞을까요?

 

프록시 초기화(프록시객체의 초기화) : 프록시 객체의 target필드에 실제 엔티티 객체의 참조를 설정하는것.

  1. em.getReference()를 하게되면, 프록시 객체가 영속성컨텍스트(1차캐시)에 저장된다. 프록시는 내부에 Member target;이라는 멤버변수(필드)를 가지고 있다.

  2. member.getName()을 호출해서 초기화 요청을 한다.

  3. JPA는 영속성 컨텍스트(1차캐시)에 실제 엔티티객체가 있는지 확인한다.

4-1. 있으면, JPA는 프록시 객체 내부의 target필드에 1차캐시에 있는 실제 엔티티객체의 참조를 설정한다.

4-2 없으면, JPA는 db조회를 해서 실제 엔티티객체를 생성하고 프록시 객체 내부의 target필드에 실제 엔티티객체의 참조를 설정한다.

  1. 초기화된 필드를 통해 실제 객체의 메서드를 호출한다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님 질문에 대한 부분을 살펴보니 프록시 객체의 초기화 과정에 대한 이해를 정리하신 것 같습니다. 정리해주신 내용이 대체로 맞습니다만, 좀 더 매끄러운 이해를 돕기 위해 추가적으로 설명을 드리겠습니다.

우선, 프록시 객체는 실제 엔티티의 데이터를 대신하는 역할을 하며, 엔티티에 대한 지연 로딩(lazy loading)을 가능하게 합니다. 즉, 엔티티의 데이터에 실제로 접근하려고 할 때만 데이터베이스에서 데이터를 조회하고 이를 1차 캐시에 저장하는 방식이죠.

  1. em.getReference() 메소드를 사용하면 프록시 객체가 반환되며, 해당 객체는 실제 엔티티 객체의 데이터가 아닌, 해당 데이터로의 참조를 가진 객체입니다. 프록시 객체는 영속성 컨텍스트의 일부로 1차 캐시에 등록됩니다.

  2. member.getName() 과 같은 메소드를 호출하면 JPA는 프록시 객체가 초기화 여부를 판단합니다. 즉, 실제 데이터에 접근이 이루어짐을 알게 됩니다.

  3. 초기화 단계에서 JPA는 이미 1차 캐시에 실제 엔티티 객체가 존재하는지 확인합니다.

4.1. 실제 엔티티 객체가 1차 캐시에 존재하면, 프록시 객체 내부의 target 필드에 해당 실제 엔티티 객체가 설정됩니다.

4.2. 1차 캐시에 존재하지 않으면, JPA는 데이터베이스 조회를 통해 새로운 엔티티 객체를 생성하고, 이를 1차 캐시에 저장하며, 프록시 객체의 target 필드 역시 해당 엔티티 객체를 참조하게 됩니다.

  1. 이후, 프록시 객체는 실제 엔티티 객체의 메서드 호출을 프록시 메커니즘을 통해 실제 엔티티 객체로 위임하게 됩니다.

이 과정에서 중요한 점은 JPA가 어떻게 최초 호출 시점에서 데이터베이스를 조회하여 필요시에만 데이터를 가져오는지를 이해하는 것입니다. 이를 통해 메모리를 효율적으로 관리하고 불필요한 데이터베이스 액세스를 줄일 수 있게 됩니다.

아래의 링크를 참고하시어 다른 유사 질문에 대한 답변을 확인하여 추가적인 이해를 도모하실 수 있습니다.

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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기