• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

프록시 초기화 detach 질문

24.04.20 18:01 작성 조회수 67

0


[질문 내용]
안녕하세요

저와 비슷한 질문이 게시판에 올라와있는데 답변이 이해가지 않아서 질문 올립니다

 

아래 코드에서 강의와 다른점은 System.out.println에서 reference.getClass() 대신 reference를 썼다는 점 입니다.

try {
            Member member1 = new Member();
            member1.setName("member1");
            em.persist(member1);

            em.flush();
            em.clear();

            Member reference = em.getReference(Member.class, member1.getId());
            System.out.println("reference = " + reference);

            em.detach(reference);

            System.out.println(reference.getName());

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            em.close();
}

reference.getClass()에서 getClass()를 쓰지 않으면

reference.geName()했을때 member1로 출력이 됩니다.

그런데 이 이유를 모르겠습니다.

 

저는 detach(reference)를 하면 프록시 객체 reference가 영속성 컨텍스트에서 분리되어서 getName()을 쓰지 못할거라고 생각했는데 왜 member1이 출력되는지 모르겠습니다

여기서도 에러가 나야하는것 아닌가요?

 

 

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.04.22

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

AI 답변 링크의 영한님의 답변을 참고해주세요

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.20

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

한조님, 질문하신 프록시 초기화와 detach 동작에 대해 궁금하신 점이 있으신 것 같습니다. 특히, 왜 detach 호출 후에도 getName() 메서드로 값을 정상적으로 출력할 수 있는지에 대한 부분인데요.

해당 질문은 프록시 객체의 초기화와 관련된 동작 메커니즘을 이해하는 데 중요한 질문입니다. 강의 내에서도 비슷한 주제에 대해 다루고 있는데, 간단히 설명드리자면, getReference로 얻어진 프록시 객체는 실제 필요한 시점(접근 시)에 초기화되어 실제 엔티티를 로딩합니다. 이 때 System.out.println에서 reference를 출력하는 순간, toString() 메서드를 호출하기 때문에 프록시 초기화가 발생하고, 이로 인해 실제 엔티티에 접근하게 됩니다.

그러나, detach 메소드는 해당 엔티티(혹은 프록시)를 영속성 컨텍스트에서 분리시키는 역할을 합니다. 분리된 이후에는 JPA가 더 이상 엔티티의 상태 변화를 관리하지 않습니다. 그럼에도 불구하고, 초기화된 프록시 객체는 이미 실제 엔티티의 데이터를 로드한 상태입니다. 따라서, 영속성 컨텍스트로부터 분리된 이후에 호출되는 getName() 메서드는 이미 로딩된 데이터에 기반하여 정상적으로 값("member1")을 반환할 수 있습니다.

프록시 강의 중 초기화 실패 예제에 대한 질문 링크에서 비슷한 상황에 대한 설명이 있습니다. 하이버네이트와 JPA 동작 방식에 대한 깊은 이해를 돕는 내용입니다.

이 설명이 한조님의 프록시 객체와 detach 동작에 대한 궁금증을 해소하는 데 도움이 되었기를 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.