Query DSL로 JPA의 N+1 문제 해결하기

Minyuk·2023년 1월 16일
0
post-thumbnail

N+1 문제란 ?

JPA에서 연관 관계가 있는 엔티티를 조회할 때, 조회된 데이터의 개수만큼 연관 관계에 대한 추가적인 조회 쿼리가 발생하는 이슈

  • 실행된 쿼리 로그를 보면 Item 테이블의 row 1개를 조회하는데, 총 2번의 쿼리가 실행되었다. 지금은 row의 개수가 적지만 더 많아지면 추가적인 쿼리가 실행 될 것이다.

Lazy 로딩을 사용하면?

@OneToMany 어노테이션의 데이터 조회 전략을 Lazy로 설정하더라도 연관 관계가 있는 레퍼런스를 참조하는 경우에 추가적인 조회 쿼리가 실행

Query DSL 소개

HQL 쿼리를 타입에 안전하게 생성 및 관리할 수 있게 해주는 프레임워크
-> "자바 코드 기반으로 쿼리를 작성하게 해준다"

해결방법

BatchSize, EntityGraph 등으로도 해결이 가능하지만 Query DSL의 fetch join을 사용해서 해결

  • 쿼리 실행 결과를 보면 여러번의 쿼리가 실행되지 않고 연관 관계가 있는 데이터까지 조인해서 데이터를 가져온 것을 확인할 수 있다. 이처럼 QueryDSL의 fetch join을 사용하면 JPA의 N+1 문제를 회피할 수 있다.

Fetch Join

  • 조회의 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 SELECT 하여 모두 영속화
  • FetchType이 Lazy인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 N+1 문제가 해결
profile
학습 내용 기록하기

0개의 댓글