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

이수찬님의 프로필 이미지

작성한 질문수

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

jpa에서는 같은 영속성 컨텍스트 레벨안에서 ==(instance of) 가 true가 나와야 하는 이유가 궁금합니다

22.10.19 16:43 작성

·

125

1

(프록시 강의 26분~)

안녕하세요

영한님께서 jpa에서는 같은 영속성 컨텍스트 레벨 안에서 ==가 항상 true를 보장한다고 하셨는데,

이 부분이 잘 이해가 되지 않습니다.

  1. em.find( = m1) 후 em.getReference( = m2)

    em.find하면 영속성 컨텍스트에 실제 member가 저장되니까

    em.getReference를 하면, 껍데기를 만들고, 영속성 컨텍스트에 실제 entity값을 DB에서 가져다 달라고 요청하려 하는데, 이미 1차 캐시에 entity가 존재해서 em.getReference를 해도

    m1 == m2가 성립하는 것으로 이해했습니다.

     

  2. em.getReference 후 em.getReference

    em.getReference => 프록시 객체 반환

    이때 프록시 객체를 초기화하는 과정에서 영속성 컨텍스트에 실제 entity를 저장할텐데,

    다시 em.getReference를 하면 1차 캐시에 있는 entity를 사용하면 될텐데,

    왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다.

     

  3. em.getReference 후 em.find

    em.getReference => 프록시 객체 반환

    em.getReference에서 프록시를 초기화하는 과정에서 위와 같이 1차 캐시에 entity가 저장될텐데,

    왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다.

     

    위의 3가지 예제를 보니, 여러 과정들을 거쳐 결국 jpa는 같은 영속성 컨텍스트 안에서 ==가 항상 true를 보장되는지, 아니면 true를 먼저 보장하기 위해서 다른 과정들을 끼워 맞추는지 궁금합니다.

     

    여러 과정 => 결국에 모두다 ==가 보장됨

    or

    모두 다 ==를 보장해야함 => ==가 true가 나오도록 끼워 맞추자.

     

    마지막으로 jpa가 같은 영속성 컨텍스트 레벨에서 어떻게 ==를 true로 보장해주는지도 궁금합니다.

     

     

     

     

     

 

 

답변 1

1

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

2022. 10. 22. 16:38

안녕하세요. 이수찬님 좋은 질문입니다.

여기서 중요한 사실은 최초에 뭘로 조회했냐 입니다.

최초에 엔티티로 조회하면 em.getReference로 조회해도 엔티티가 나옵니다.

최초에 em.getReference로 프록시를 조회하면, 이후에 em.find, em.getReference로 조회해도 같은 프록시 객체 인스턴스가 조회됩니다.

이렇게 하면 일관성이 보장되겠지요?

감사합니다.