프로젝트를 하면서 fetch join을 다시 JPA 책을 보면서 복습했다.
fetch join은 JPQL 기능으로 연관된 엔티티나 컬렉션을 한번에 같이 조회하는 것이다.
"select m from Member m join fetch m.team"
이렇게 페치 조인을 하면 Member만 조회를 했지만 실제 쿼리는 Member와 연관된 Team도 함께 조회하게 된다.
페치 조인을 사용하지 않을 경우 Member만 조회하고 조인을 한 Team은 조회하지 않는다.
연관 관계가 지연 로딩으로 설정 되어 있으면 프록시나 아직 초기화 되지 않은 컬렉션 래퍼를 반환한다. 그리고 나중에 접근할때 추가로 쿼리가 나가기 때문에 페치 조인을 잘 활용하는 것이 좋다.
fetch join을 사용할때 주의할 점
1. 페치 조인 대상에 별칭을 잘못 사용하면 연관된 데이터 수가 달라져서 데이터 무결성이 깨질 수 있으므로 조심해서 사용해야 한다. (연관된 데이터 수가 달라진 상태에서 2차 캐시에 저장되면 위험)
2. 둘 이상의 컬렉션을 페치할 수 없다. (카테시안 곱) -> @BatchSize 활용
3. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다. (경고 로그를 남기면서 메모리에서 페이징 처리를 해서 위험)
'JPA' 카테고리의 다른 글
[JPA] 위치 좌표(위도, 경도) 다루는 법 (hibernate spatial ) (0) | 2023.01.15 |
---|---|
[JPA] 변경 감지와 병합(merge) (0) | 2022.07.08 |
[JPA] 엔티티(Entity)에 기본 생성자를 선언해야 하는 이유 (Builder 패턴, static factory method) (0) | 2022.07.07 |
[JPA] JPQL (0) | 2022.07.05 |
[JPA] 프록시를 이용한 지연 로딩(FetchType.LAZY)과 연관관계 옵션(영속성 전이, 고아 객체) (0) | 2022.06.30 |