본문 바로가기

백엔드/DB 상세 정보

N+1 문제

반응형

** 정의

- 연관관계에서 발생하는 이슈.

- 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n)만큼 연관 관계의 조회 쿼리가 추가로 발생

 

 

** 발생하는 이유

- JPA는 메서드 이름을 분석해서 쿼리를 실행하게 된다.

- 객체지향 쿼리 언어라서, select * from 엔티티명 이라는 쿼리를 날리게되면, 

해당 엔티티의 정보만 모두 가져오게 된다.

 

 

**해결 방법

1. Fetch Join

원하는 쿼리가 left join이라고 가정해보자.

@Query("select n from 엔티티명 as n join fetch 컬럼명")
List<Owner> findAllJoinFetch();
 
위와 같은 방식으로 쿼리를 날릴 수 있다.
 
단점은 우리가 연관관계 설정해놓은 것이 무의미하다는 것이다.
 
 
2. Entity Graph
@EntityGraph(attributePaths = "조인할 테이블명")
@Query("select n from 엔티티명 as n")
List<엔티티> findAllEntityGraph();
 
 
Fetch Join과 Entity Graph는 모두 중복 데이터가 존재한다는 단점이 있다.
 
이를 해결하기 위해 다음과 같이 할 수 있다.
1. Subselect

2. Query Builder

 

 

** 결론

JPA는 만능이 아니다.

다양한 상황을 핸들링하려면 쿼리빌더 등 직접 쿼리를 날리는 방법도 익혀두는 것이 필요하다.

 

** 참고

https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1 

 

N+1 문제 - Incheol's TECH BLOG

Query를 실행하도록 지원해주는 다양한 플러그인이 있다. 대표적으로 Mybatis, QueryDSL, JOOQ, JDBC Template 등이 있을 것이다. 이를 사용하면 로직에 최적화된 쿼리를 구현할 수 있다.

incheol-jung.gitbook.io

 

반응형

'백엔드 > DB 상세 정보' 카테고리의 다른 글

MyBatis 개요  (0) 2022.10.14
Data Replication 개요  (0) 2022.10.11
정규화  (0) 2022.08.26
ORM  (0) 2022.02.21