본문 바로가기

항해99

항해99 49일차 TIL1 - JPA 프록시는 왜 필요할까?

프록시는 왜 필요할까요?

엔티티는 서로 관계를 맺고 있습니다. 그래서 원하는 엔티티를 불러오는 것은 쉬운일이 아닐수도 있는데요. 그 중 가장 쉬운 방법은 데이터베이스에서 불러올 때 연관된 객체를 모두 불러오는 것입니다. 하지만 효율적인 선택지가 아닙니다. 연관된 객체를 모두 사용하는 것은 아니니까요. JPA에서는 이 문제를 효율적으로 해결하기 위해 지연로딩 기능을 제공하는데요. 이것을 가능하게 하는 것이 프록시입니다.

 

그렇다면 프록시는 무엇일까요? 아래 소스 코드를 통해 알아봅시다.

// Member 는 Team 과 연관관계를 맺고 있습니다.

Member proxyMember = em.getReference(Member.class, 1l);
Member entityMember = em.find(Member.class, 2l);

System.out.println("proxyMember class = " + proxyMember.getClass());
System.out.println("entityMember class = " + entityMember.getClass());

 

그렇다면 이 프록시 객체는 진짜 엔티티를 호출하는 것과 무슨 차이가 있을까요? getReference로 엔티티를 호출하게 된다면 연관관계가 있는 엔티티들을 조회하지 않습니다. 즉, join 쿼리문이 나가지 않습니다.

원래라면 join문을 사용해서 Team을 불러와야겠죠. 이렇게 우리가 사용하는 지연로딩에는 프록시라는 기술이 활용되고 있습니다.