보통 JPA 를 사용하면서 N+1 문제를 겪게 되면 해결방법 중 하나인 FETCH JOIN을 사용한다고 합니당
N+1 문제는 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상입니다
Join
- Fetch Join과 달리 연관 Entitiy에 Join을 걸어도 실제 쿼리에서 SELECT 하는 Entity 는 오직 JPQL에서 조회하는 주체가 되는 ENITITY만 조회하여 영속화
- 조회의 주체가 되는 Entity만 SELECT 해서 영속화 하기 떄문에 데이터는 필요하지 않지만 연관 Entity가 검색 조건에는 필요한 경우 주로 사용한다
Fetch Join
- 조호의 주체가 되는 Entitiy이외에 Fetch Join 걸린 연관 Entity도 함께 select 하여 모두 영속화
- Fetch Join이 걸린 Entity 모두 영속화하기 때문에 FetchType이 LAZY인 Entity를 참조하더라도 이미 영속성 컨텍스트 안에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 N+1 문제가 해결됨
아래 테스트 코드로 Transaction 엔티티와 연관관계에 있는 Account 엔티티를 동적쿼리 테스트 코드를 실행 해보았습니다.
JOIN을 사용하게 되면 주체가 되는 Transaction 이 조회가 되고 그다음에 Account 엔티티가 조회가 되는데 이 문제를 N+1문제라고 합니다
위에 코드와 같이 FETCH JOIN을 사용하면 아래 코드와 같이 sql이 실행되어 Transaction과 account가 영속화 되기 때문에 n+1 문제가 해결이 됩니다.
무조건 FETCH JOIN 만을 사용하는게 답이 연관관계가 없는 두 테이블을 조회할 땐 Join을 사용해도 된다.
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.