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

신동훈님의 프로필 이미지
신동훈

작성한 질문수

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

프록시

프록시의 getter에 대해서

작성

·

204

1

안녕하세요 강사님!!!  수업에 나온 내용은 아니었으나 강사님의 책 [자바 ORM 표준 JPA 프로그래밍]을 읽으며, 강사님의 강의를 복습 도중 조금 의아한 부분이 생겨서 질문 남깁니다.

강사님의 책 '294P'의 프록시와 식별자 파트를 보면 다음과 같이 강사님이 적어주셨습니다. "엔티티 접근 방식을 필드(@Access(AccessType.FIELD))로 설정하면 JPA는 getId()메소드가 id만 조회하는 메소드인지 다른 필드까지 활용해서 어떤 일을 하는 메소드인지 알지 못하므로 프록시 객체를 초기화한다."

저는 해당 설명을 보고, 직접 테스트하기 위해 코드를 작성했습니다. 그런데 필드 접근법으로 해도 프록시 객체가 초기화되지 않았습니다!

그래서 강사님이 책을 쓰셨던 버전보다 업그레이드가 됐나보다 하고 조금 더 실험을 해보았습니다.

제가 해본 실험은 이렇습니다. getId()메소드를 age필드를 반환하도록 만들었습니다.

 

@Id @GeneratedValue

private Long id;

 

private Long age;

 

public void getId(){return age;}

이렇게요.

그 후 Member의 age는 12로 설정한 후, 저장시킨 다음에 다음을 실행했습니다.

em.getReference(Member.class, 1L);을 통해 가져온 프록시 객체를 가지고 다음을 순서대로 진행했습니다.

getId();

getAge();

getId();

그랬더니 결과가 조금 놀라웠습니다

( select 쿼리발생)

12

12

다음과 같이 결과가 발생하였는데, JPA에서 내부적으로 프록시 객체를 생성할 때, getter에 대해서 getId면 id만 반환하도록 재정의시켜서 생성하는 것인가요?

 

https://ttl-blog.tistory.com/136

이곳에 위의 실험에 대해 적어놨습니다! 글로만 이해가 안되신다면 한번 봐주시길 부탁드립니다..!

항상 강의 잘 보고 있습니다 감사합니다

 

답변 1

0

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

안녕하세요. 신동훈님

이 부분은 프록시 객체의 성능 최적화와 관련이 되어 있습니다.

id의 경우 이미 알고 있기 때문에, 최대한 초기화를 하지 않으려고 노력하는 것이지요.

JPA에서는 이런 점 때문에 getter의 경우 필드와 데이터를 맞추어야 합니다.

 

더 자세한 내용은 다음을 참고해주세요.

https://www.inflearn.com/questions/74141

https://www.inflearn.com/questions/204850

감사합니다.

신동훈님의 프로필 이미지
신동훈

작성한 질문수

질문하기