[JPA] 프록시 객체

김형진·2023년 5월 29일
0

JPA는 지연로딩하는 참조 객체에 대해선 proxy객체를 만들어준다.
그리고 참조 객체의 메소드 호출 시 DB에서 참조 객체 데이터를 조회하여 proxy객체가 참조하는 필드에 주입한다.
즉 DB조회 이후 참조객체가 entity로 재할당되는 것이 아니라, proxy껍데기는 그대로되 내용물이 채워지는 것이다.

가끔 지연로딩임에도 proxy객체가 아닌 실제 entity가 들어오는 경우가 있는데, 이는 참조 객체가 영속성 컨텍스트에서 이미 관리되고 있었기 때문에 JPA가 실제 객체를 할당해준 것이다.

참고
준영속 상태의 proxy객체를 통해 실제 데이터에 접근하려고 하면 에러가 발생한다. proxy를 통해 실제 데이터에 접근하는 것도 영속성 관리 컨텍스트를 통해서 이뤄지기 때문이다.

참고2
JPA 표준에서는 프록시 객체를 강제초기화하는 메소드가 제공되지 않기 때문에 초기화 시 team.getName()과 같이 엔티티 메소드를 호출하여 초기화한다.
이 때, 엔티티 접근방식이 프로퍼티로 설정(@Access(AccessType.PROPERTY))된 경우 getId()와 같이 식별자를 조회하는 메소드를 호출해도 proxy가 이미 식별자 정보는 가지고 있기 때문에 초기화되지 않는다.
프로퍼티 접근방식을 사용하는 경우 식별자가 아닌 다른 필드를 조회하는 메소드를 사용하거나 @Access(AccessType.FIELD) 로 설정해야 프록시객체가 제대로 초기화될 수 있다.

profile
히히

0개의 댓글