포스트

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 를 이해할 수 있었습니다.

누구나 쉽게 배우는 Dynamic Proxy 다루기


요약하자면, Proxy.newProxyInstance() 메서드를 사용하여 프록시 객체를 생성하고, InvocationHandler 인터페이스를 구현하여 메서드 호출을 처리하는 것이 Dynamic Proxy 의 작동 방식입니다.

Javassist

그러나, reflection api 를 활용한 Dynamic Proxy 는 인터페이스를 대상으로만 작동합니다. 그런데 우리가 만드는 @Entity 는 모두 class 입니다. 그래서 class 에 대한 proxy 를 사용하기 위해서 Hibernate 는 javassist 를 사용합니다.
스택오버플로우에서는 다음과 같은 질문과 답변을 확인할 수 있었습니다.

hibernate 가 proxy 객체를 구현하는 방법

javassist 가 hibernate 에 필수인지 여부에 대한 문의 글도 찾을 수 있었습니다.

hibernate 에 javassist 가 포함되어야 할까요?


종합적인 답변에 의하면 hibernate 는 javassist 를 사용해 연관관계의 엔티티에 대한 프록시 객체를 만들고 있습니다.

결론

hibernate 의 lazy loading 원리에 대한 이해를 위해서는 javassist 공식 문서 를 참고해서 javassist 에 대한 이해를 높여야겠습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.