Fetch Join과 일반 조인의 차이
데이터베이스와 JPA에서의 조인은 유사한 특성을 가지고 있지만 몇 가지 핵심적인 차이점이 존재한다.
특히 JPA에서는 Fetch Join이라는 개념을 도입함으로써 일반적인 SQL 조인과는 다른 방식으로 연관 엔터티를 처리한다.
주요 목적
- Fetch Join
연관된 엔터티나 컬렉션을 SQL 한 번의 쿼리로 함께 조회하려는 목적으로 사용된다.
주로 Lazy Loading 대신 연관된 엔터티를 즉시 로딩하는 경우에 활용된다.
- 일반 조인 (Regular Join)
두 테이블의 데이터를 조건에 맞게 결합하여 결과를 반환하려는 목적으로 사용된다.
여기서는 연관된 데이터의 즉시 로딩이 주 목적이 아니다.
반환되는 결과
- Fetch Join
조인된 모든 엔터티를 로딩하며 반환 결과는 주로 엔터티의 형태로 받아진다.
- 일반 조인
조인된 결과에 따라 데이터가 반환되고 이는 자동으로 엔터티 형태로 변환되지 않는다.
N+1 문제
- Fetch Join
Fetch Join을 활용하면 N+1 문제를 효과적으로 해결할 수 있다.
이는 연관된 엔터티들을 단 한 번의 쿼리로 함께 로딩하기 때문이다.
- 일반 조인
일반 조인 자체는 N+1 문제의 해결책을 제공하지 않는다.
단순 조회만 하고 영속성 컨텍스트에 저장하지 않기 때문이다.
Fetch Join과 일반 조인의 차이점
Fetch Join은 연관된 엔터티들을 함께 로딩하여 영속성 컨텍스트에 저장하며 이를 통해 N+1 문제를 효과적으로 해결할 수 있다.
하지만 일반 조인은 연관된 엔터티를 함께 로딩하는 것이 주 목적이 아니기 때문에 영속성 컨텍스트에 저장되지 않고 추후 연관된 엔터티에 접근하게 될 경우 추가적인 쿼리가 발생한다.