JPA에서 엔티티에 관계를 맵핑할때 지연 로딩과 즉시 로딩을 설정할 수 있다.
그리고 지연 로딩을 했을 때의 단점을 보완하기 위한 Fetch Join에 대한 정리 글이다.
앞서 말했듯, JPA에는 엔티티에 관계를 맵핑할 때 지연 로딩과 즉시 로딩을 설정할 수 있다.
즉시 로딩 : 어떠한 엔티티가 조회되었을 때 연관된 엔티티도 모두 함께 조회
지연 로딩 : 어떠한 엔티티가 조회되었을 때 연관된 엔티티는 Proxy로 들어가게 되고, 실제로 사용될 때 DB에서 조회해서 사용
연관된 엔티티를 추가 SQL로 조회할 필요 없이 모두 가져올 수 있기 때문에, 즉시로딩이 좋아보이지만, 즉시 로딩은 다음과 같은 문제를 야기한다.
이러한 문제점들로 지연로딩을 사용하는 편이다. 그런데, 지연 로딩 또한 연관된 엔티티를 사용할 때 어차피 한번의 Query가 더 발생하지 않냐?라고 생각할 수 있다.
맞다. Fetch Join을 알기 전까진 ...
엔티티를 조회할 때 Fetch Join을 사용한다면, 개발자의 의도 하에 한 번의 Query로 연관된 엔티티를 같이 조회할 수 있다. 따라서 연관된 엔티티가 필요하지 않을 땐 Proxy가 들어오며, 필요할 때는 실제 객체를 조회할 수 있게 되어 즉시 로딩의 문제점을 보완하게 된다. (단 N:1 관계에서 1쪽에서 Fetch Join을 사용한다면 페이징이 되지 않으므로 주의해야 한다.)**