회사에서 JPA를 사용하는 도중에
과정과 과제 entity가 따로 있는 상태에서 과정 하위의 과제를 가져올 때 queryDSL로 join해서 가져오는 방법을 사용하고 있었습니다.
후에 이 과제를 가져올 때 과정-과제 상세 entity를 따로 만들어
queryDSL을 사용하지 않고 JPA를 사용하여 한번에 정렬하여 가져오도록 고쳐야 했습니다.
findBy[과정]OrderBy[과제 번호] 를 사용하여 구현하였는데
실제 동작과정을 살펴보니 과정-과제 상세 entity가 과정과 과제 entity를 포함하고 있어서 1번만 쿼리를 실행해야 할 것을
N+1번 실행하고 있었습니다.
이를 JPA에서 N+1 문제라고 한다길래 한번 찾아보았습니다.
여기서 발생한 원인은 과정-과제 상세를 전체 한번 보는 쿼리와 각각의 과정을 한번씩 보는 쿼리가 발생하기 때문이었습니다.
따라서 성능 저하의 우려로 기존에 사용하던 join-fetch의 방법으로 orderBy만 추가하여 custom repository를 적용하였습니다.
JPA를 처음 보는 입장에서는 이런 문제가 발생할 수도 있구나 하는 기록용으로 경험했던 문제를 작성하였습니다.
더 다양한 해결방법을 참고한 블로그:
https://jojoldu.tistory.com/165
JPA N+1 문제 및 해결방안
안녕하세요? 이번 시간엔 JPA의 N+1 문제에 대해 이야기 해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미
jojoldu.tistory.com
'JAVA' 카테고리의 다른 글
[JAVA] java.util 패키지 (0) | 2021.07.15 |
---|---|
[JAVA] 자바 언어의 특징 (0) | 2021.07.04 |