[JPA] JOIN, FETCH JOIN N+1 문제 해결

yookyungmin·2023년 7월 24일
0

보통 JPA 를 사용하면서 N+1 문제를 겪게 되면 해결방법 중 하나인 FETCH JOIN을 사용한다고 합니당
N+1 문제는 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상입니다

Join, Fetch Join 차이점

  • Join

    1. Fetch Join과 달리 연관 Entitiy에 Join을 걸어도 실제 쿼리에서 SELECT 하는 Entity 는 오직 JPQL에서 조회하는 주체가 되는 ENITITY만 조회하여 영속화
    2. 조회의 주체가 되는 Entity만 SELECT 해서 영속화 하기 떄문에 데이터는 필요하지 않지만 연관 Entity가 검색 조건에는 필요한 경우 주로 사용한다
  • Fetch Join

    1. 조호의 주체가 되는 Entitiy이외에 Fetch Join 걸린 연관 Entity도 함께 select 하여 모두 영속화
    2. 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을 사용해도 된다.

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글