JPA 와 Proxy
JPA 와 proxy
JPA 에서 연관관계에 있는 객체를 가져올 때, Lazy 로 설정을 하면 해당 엔티티를 프록시 객체로 가져옵니다.
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public class Member {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name= "TEAM_ID")
private Team team;
}
Team team = member.getTeam();
assertTrue(team instanceof HibernateProxy);
과연 hibernate 는 어떻게 Team 이라는 Entity class 를 proxy 로 만든걸까요?
Dynamic Proxy
이를 위해서는 Dynamic Proxy 에 대해서 이해할 필요가 있습니다. Hibernate 가 Dynamic Proxy 를 사용하는 것은 아니지만, dynamic proxy 에 대한 이해를 통해서 우리는 어떻게 proxy 객체가 생성되고 작동하는지를 이해할 수 있을 것입니다.
저는 이 블로그 글을 통해서 Dynamic proxy 를 이해할 수 있었습니다.
요약하자면, Proxy.newProxyInstance() 메서드를 사용하여 프록시 객체를 생성하고, InvocationHandler 인터페이스를 구현하여 메서드 호출을 처리하는 것이 Dynamic Proxy 의 작동 방식입니다.
Javassist
그러나, reflection api 를 활용한 Dynamic Proxy 는 인터페이스를 대상으로만 작동합니다. 그런데 우리가 만드는 @Entity 는 모두 class 입니다. 그래서 class 에 대한 proxy 를 사용하기 위해서 Hibernate 는 javassist 를 사용합니다.
스택오버플로우에서는 다음과 같은 질문과 답변을 확인할 수 있었습니다.
javassist 가 hibernate 에 필수인지 여부에 대한 문의 글도 찾을 수 있었습니다.
종합적인 답변에 의하면 hibernate 는 javassist 를 사용해 연관관계의 엔티티에 대한 프록시 객체를 만들고 있습니다.
결론
hibernate 의 lazy loading 원리에 대한 이해를 위해서는 javassist 공식 문서 를 참고해서 javassist 에 대한 이해를 높여야겠습니다.