반응형
** 정의
- 연관관계에서 발생하는 이슈.
- 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(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 |