JPA의 N+1문제는 연관관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상입니다.
ex) 유저 한명이 쓴 게시글들을 조회할 때, 유저-게시글을 join한 형태의 쿼리문을 원했지만, N개의 게시글을 또 조회하는 쿼리가 날아가는 경우라고 생각하면 될 것 같습니다.
N+1 문제를 어떻게 해결할 수 있을까요?
N+1문제를 해결하기 위해서는 fetch join 또는 @EntityGraph를 사용해 볼 수 있습니다.
- fetch join
- 연관관계에 있는 엔티티를 한번에 즉시 로딩하는 구문입니다.
- 쿼리 한번에 모든 데이터를 가져오기 때문에 JPA가 제공하는 Paging API 사용 불가능 (Pageable 사용 불가)
- 1:N 관계가 두 개 이상인 경우 사용 불가
- fetch join 대상에게 별칭 (as) 부여 불가
- @EntityGraph
- fetch join과 비슷한 효과를 만들어내며, 쿼리 메서드에 해당 어노테이션을 추가해 사용할 수 있습니다.
- fetch join은 inner join을 하는 반면, @EntityGraph는 outer join을 기본으로 한다.
+) fetch join과 @EntityGraph 사용 시 주의점
fetch join과 @EntityGraph는 공통적으로 카테시안 곱(Cartesian Product) 발생하여 중복이 생길 수 있다.
중복 발생 문제 해결방법
- JPQL에 DISTINCT를 추가하여 중복 제거
- OneToMany 필드 타입을 Set으로 선언하여 중복 제거
해결 방법에 대해서 참고 블로그를 같이 보시는 걸 추천드립니다.(특히 fetch join)
혹여나 잘못된 내용이 있다면 댓글 부탁드리겠습니다 :)
참고
기술 면접 구독 서비스 - 매일메일 https://www.maeil-mail.kr/
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
JPA 모든 N+1 발생 케이스과 해결책
N+1이 발생하는 모든 케이스 (즉시로딩, 지연로딩)에서의 해결책과 그 해결책에서의 문제를 해결하는 방법에 대해 이야기 하려합니다 😀
velog.io
https://programmer93.tistory.com/83
JPA N+1 문제 해결 방법 및 실무 적용 팁 - 삽질중인 개발자
- JPA N+1 문제 및 해결 방법 - JPA를 사용하다 보면 의도하지 않았지만 여러 번의 select 문이 순식간에 여러 개가 나가는 현상을 본 적이 있을 것이다. 이러한 현상을 N+1문제라고 부른다. 해당 포스
programmer93.tistory.com
https://velog.io/@xogml951/JPA-N1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%B4%9D%EC%A0%95%EB%A6%AC
JPA N+1 문제와 해결법 총정리
JPA로 개발 과정에서 N+1문제를 만나면서 해맸던 부분들과 실제 프로덕션에서 이를 제대로 처리하지 못하면 성능적인 저하뿐만 아니라 장애로 이어질 수 있다는 부분을 깨닫고 정리 해보고자 합
velog.io
https://dev-coco.tistory.com/165
[JPA] N+1 문제 원인 및 해결방법 알아보기
JPA를 사용하면 자주 만나게 되는 것이 N + 1 문제이다. N + 1 문제는 성능에 큰 영향을 줄 수 있기 때문에 N + 1 문제가 무엇이고 어떤 상황에 발생되는지, 어떻게 해결하면 되는지에 대해 알아보고
dev-coco.tistory.com
'자잘한 cs' 카테고리의 다른 글
엔티티 매니저에 대해 설명해주세요. (0) | 2024.11.20 |
---|---|
JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (0) | 2024.11.18 |
Redis가 빠른 이유 (0) | 2024.06.10 |
프록시 패턴이란? (0) | 2024.05.22 |
reverse proxy란? (0) | 2024.05.10 |