JAVA/JPA & QueryDSL 학습 기록2 JPA saveAll()의 N+1 문제 해당 포스터는 Volunteer 프로젝트의 내용입니다. 발생 원인 JPA saveAll()를 사용할 때, Bulk Insert를 기대했으나 기대와는 다르게 엔티티 각각 INSERT 쿼리가 발생되었다. 즉, N개의 엔티티를 저장했을 때 INSERT 쿼리가 N개가 발생한다. 먼저, saveAll() 메서드 내부 구조를 조금 더 자세히 알아보자. saveAll() 메서드 내부적으로 루프를 통해 결국 save() 메서드를 사용한다. 영속성 컨텍스트에서 ID가 null(0L) 인지를 판별해서 새로운 객체임을 판단하고, 새로운 엔티티일 경우 영속화를 진행한다. 이때, INSERT 쿼리가 발생하는 것을 예상할 수 있다. (실제 DEBUG을 했을 때도 즉시 INSERT 쿼리가 발생했다.) 💡 그럼 JPA를 사용할 때,.. 2024. 2. 1. JPA & Querydsl exists 성능 분석 들어가기 앞서 Volunteer 사이드 프로젝트를 진행하면서 Spring Data JPA를 이용해 exists 함수를 사용해야할 상황이 있었다. Spring Data JPA는기본 메서드로 existsBy~ 형태로 제공하지만, where절의 조건이 3개,4개... 증가할 수록 필드명이 너무 길어져 @Query를 사용합니다. 대부분 아시다시피, Spring Data JPA는 exists 함수를 제공하지 않기 때문에, 이를 대체하고자 Querydsl를 사용합니다. 또한, Querydsl은 서브쿼리로만 exists 함수를 제공하고 성능상 이슈가 있어 직접 구현해야하는 걸로 알고 있습니다. 직접 얼만큼 성능차이가 있는지 눈으로 보기 위해서 몇가지 경우를 직접 성능 테스트 해보았습니다. Querydsl의 기본 ex.. 2023. 7. 4. 이전 1 다음