인프런 커뮤니티 질문&답변

Hyeon_053님의 프로필 이미지

작성한 질문수

fetch join 질문

23.10.05 21:10 작성

·

126

0

Fetch join에 있어 궁금한 점이 있어서 남깁니다.

Fetch join을 사용할 때 서로 떨어진 테이블끼리도 fetch join을 사용할 수 있는지 궁금합니다.

일단 페이징 같은 기능이 없다는 가정하에,

예를 들어 Entity 1 - Entity 2가 다대일의 관계이고, Entity 2 - Entity 3이 다대일의 관계로 묶여있다면,

select * from Entity1 e1 join fetch e.Entity2 join fetch e.Entity2.Entity3;

위와 같이 join fetch e.Entity2.Entity3; 이러한 fetch join 문이 가능한가에 대해서 궁금합니다.

만약 이것이 불가능하다면 저러한 상황에서 Entity2를 기준으로 쿼리를 하는 것 말고 다른 방법으로 최적화 할 수 있는 방법이 있는지 궁금합니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 10. 06. 21:16

안녕하세요, 인프런 AI 인턴이에요.
Fetch join에 대해 궁금하신 점에 대해 답변해드리겠습니다.

Fetch join은 JPA에서 엔티티 그래프를 사용하여 한 번의 쿼리로 연관된 엔티티들을 함께 로딩하는 기능입니다.
Fetch join을 사용할 때, 서로 떨어진 테이블 간에도 사용할 수 있습니다.
즉, 여러 개의 연관 관계를 Join fetch로 함께 로딩할 수 있습니다.

보시고 계신 쿼리는 다수의 연관 관계를 함께 로딩하는 쿼리로 정상적으로 작동합니다.
select * from Entity1 e1 join fetch e1.Entity2 join fetch e1.Entity2.Entity3;

이렇게 작성된 fetch join 쿼리를 실행하면 Entity1, Entity2, Entity3에 대한 모든 데이터가 한 번의 쿼리로 로딩됩니다.

만일 위의 쿼리가 원하는 결과를 제대로 리턴하지 않는다면, 엔티티의 매핑 설정이나 데이터 상태 등을 확인해보시는 것이 좋습니다.

참고로, Fetch join을 사용할 때에는 Lazy 로딩이 아닌 Eager 로딩으로 인해 데이터베이스 레코드 뻥튀기 현상을 유발할 수 있으므로 주의해야 합니다.
이러한 이유로 일부 경우에는 Fetch join을 대체할 다른 방법을 사용하기도 합니다.
하지만 이에 대해서는 상황과 요구사항에 따라 적절한 최적화 방법을 선택하셔야 합니다.

더 궁금한 사항이 있으시다면 언제든지 물어보세요! 즐거운 프로그래밍 공부되세요.