JPA는 지연 로딩과 즉시 로딩을 둘 다 지원한다.
지연 로딩과 즉시 로딩에 대해 알아보자.
해당 자료로 간단하게 설명을 해보겠다.
MEMBER와 TEAM이 있다. MEMBER와 TEAM은 연관관계가 있고, 어떨 때는 MEMBER만 쓰이고 어떨 때는 MEMBER와 TEAM이 같이 사용 될 경우가 있다.
만약 로직을 짤 때 MEMBER를 조회 할 때 항상 TEAM이 같이 사용이 된다면? TEAM의 사용 빈도가 올라가게 되므로 즉시 로딩으로 한번에 MEMBER를 조회할 때 TEAM을 같이 조회하는 것이다. 그렇게 된다면 네트워크 통신이 줄고 DB 간에 이동도 줄일 수 있다고 한다.
하지만 MEMBER 조회할 때 TEAM을 사용하는 빈도가 매우 적다면 MEMBER만 조회하는게 성능이 좋을 것이다. 그러므로 지연 로딩을 사용하여서 MEMBER만 사용하도록 MEMBER만 가져오고 연관된 TEAM 정보를 가져오지 않게 해서 불필요한 동작을 줄여 성능 개선이 될 것이다.
그림에서 보이듯이 memberId로 member를 조회 했고 그 다음으로 team을 조회하고 team이름을 조회하는 코드이다.
코드 상으로는 같은 동작으로 보이지만 지연 로딩과 즉시 로딩의 동작 방식은 다르다.
지연 로딩
실제로 객체가 사용이 될 때 로딩이 되어 SQL문을 보면 MEMBER에 대해서만 조회가 되고, 그 다음으로 team 정보를 조회 할 때 TEAM에 대해서 조회를 한다.
요약 -> 실제로 해당 정보가 필요할 때 해당 객체의 정보를 가져 옴.
즉시 로딩
실제로 연관된 객체가 사용이 되지 않더라도 연관된 객체 정보를 조회하는 것이다. SQL문을 보면 처음부터 MEMBER와 TEAM의 JOIN문으로 쿼리가 나가게 되는 것을 볼 수 있다.
요약 -> 실제로 사용할 객체 정보와 연관된 객체의 정보까지 가져 옴.
지연 로딩 VS 즉시 로딩
지연 로딩이 더 좋냐 즉시 로딩이 더 좋냐 라기보다는 어떤 상황에서 어떤 로딩을 사용해 성능 개선을 해야할지 고민을 하는 것이 좋다.
강의에서는 보통 JPA 개발 때는 모두 지연 로딩으로 세팅을 해 놓은 후, 성능을 보고 어느 부분은 즉시 로딩으로 하는 것이 좋을 것 같다 하면 그 때 즉시 로딩을 사용해 최적화를 하면 된다고 했다.