-
[JPA] JPQL 페치 조인(fetch join)인프런 - 스프링/JPA 프로그래밍 - 기본편 2023. 12. 4. 23:06
- 페치 조인을 하게 되면 위의 그림과 같이 5개의 엔티티가 영속성 컨텍스트에 올라오게 된다.
- 일대다 관계이기 때문에 당연히 일인 쪽이 중복되어 나올수밖에 없다.
- 일반 조인은 연관된 엔티티를 함께 조회하지 않고 단순히 where 절 같은 조건에서 사용할 뿐이다. 예를 들어 위의 예시에서 팀을 멤버와 조인하고 멤버의 이름이 특정 이름인 팀만 조회할 수 있다.
- 예를 들어 "select t from Team t join fetch t.members m where m.age > 10" 과 같은 쿼리가 있다고 하였을 때 이 때의 목적은 팀과 연관된 멤버들 중에서 나이가 10살이 넘는 멤버들과 팀들만 가져오고 싶은 경우인데 애초에 JPA는 연관관계의 객체 그래프에서 team.getMember()를 통해 팀과 연관된 모든 회원을 가져오는 것을 의도적으로 설계한 것이기 때문에 JPA에서는 페치 조인 대상에는 별칭을 줄 수 없다. 만약 위의 조건대로 쿼리를 날리고 싶을때는 멤버를 기준으로 해당 조건을 만족하게 쿼리를 날리는 것이 맞다.
- 메모리에서 페이징 한다는 것은 일단 쿼리로 데이터를 다가지고 온다는 것을 의미하기 때문에 만약 데이터가 굉장히 많다면 운영상의 큰 문제가 발생할 수 있다.
컬렉션 페치 조인 시 페이징 API 관련 문제 해결 방법
1. 기존 쿼리에서 페치 조인을 제외한다. 이렇게 되면 쿼리가 N + 1 개 나가게 되어 성능이 저하된다.
2. 배치 사이즈를 적용시키면 사이즈 개수만큼 팀에 연관된 멤버들을 select 하는 쿼리가 한번에 나가게 된다. (기존에는 팀 마다 회원 조회하는 쿼리가 나갔다.)
- 쿼리가 이런식으로 팀과 관련된 멤버들을 한번에 조회하는 쿼리가 나간다. 여기에서는 팀 id가 총 100개까지 적용된다. 배치 사이즈를 글로벌 세팅하는 방법도 있다.
출처: 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
현업에서 실제로 JPA로 개발을 하고 있습니다. 그런 입장에서보면 지금 작성하고 있는 코드들이 어떻게 작동하는지 이해하는데 큰 도움을 주는 강의입니다. 다음은 제가 느낀 이 강의의 장점들
www.inflearn.com
'인프런 - 스프링 > JPA 프로그래밍 - 기본편' 카테고리의 다른 글
[JPA] JPQL 엔티티 직접 사용 (1) 2023.12.05 [JPA] JPQL 다형성 쿼리 (1) 2023.12.05 [JPA] JPQL 경로 표현식 (0) 2023.12.04 [JPA] JPQL 조건식과 함수 (0) 2023.12.04 [JPA] JPQL 타입 표현과 기타식 (2) 2023.12.04