querydsl4 검색 쿼리 리팩토링 이번 시간에는 페이징 기능을 구현하며 상품 검색에 필요한 조회 성능을 개선한 과정을 정리하고자 합니다. 기존 검색 구현 방식에서는 상품과 연관된 데이터를 개별적으로 모두 조회한 후, Stream을 사용해 조건에 맞는 데이터를 필터링하고 매핑했습니다. 그러나 이 과정에서 상품 조회와 관련된 쿼리 코드에 중복이 많았고, 실행되는 쿼리 수도 많았습니다.이 문제를 해결하기 위해 개선 전 코드와 개선한 코드를 비교하고, 성능 테스트 코드를 통해 개선 효과를 확인해 보겠습니다. 해당 트러블 슈팅에 대해서 Github에도 정리했으니 참고해주세요.리팩토링 전리팩토링 전 코드는 아래와 같습니다. 데이터 조회 및 처리 로직이 길고 복잡했습니다. 각 태그(userDefinedTag, recommendedTag) 정보.. 2024. 12. 10. 1:N 조인에서 발생한 중복 데이터 및 누락 문제 해결 이번 시간에는 검색 구현 과정에서 발생한 중복 데이터 조회 오류를 정리해보고자 한다. 프로젝트 코드는 Github에 있으니 참고해주세요. 문제상품 페이징 조회 기능을 구현하던 중, 예상치 못한 문제가 발생했었다. API를 통해 데이터를 조회했을 때, DB에서 직접 조회한 결과와 비교해보니 일부 데이터가 누락된 것이다. DB에서 직접 쿼리를 실행했을 때는 12개의 데이터 항목이 모두 정상적으로 조회되었지만, API를 통해 조회한 결과는 단 6개의 항목만 반환되었다. POSTMAN 실행다음과 같이, postman에 페이징 api 요청을 실행했었다. 문제 분석이 문제를 해결하기 위해, 가장 먼저 살펴본 것은 search_fetch 로직이다.이 로직은 QueryDSL을 사용하여 페이징 쿼리로 구현했었다. LE.. 2024. 8. 10. SpringBoot 3.x 버전 QueryDSL 설정 이번 시간에는 프로젝트에서 JPA, Querydsl을 적용한 부분을 정리하고자 한다. 최근 스프링 부트 3.0 이상 버전이 나옴에 따라 바뀐 설정 내용을 함께 공유하려고 한다. 목차는 다음과 같다. Gradle 설정 Jpa Custom Respository 적용 1. Gradle 설정 개발환경은 다음과 같다. IntelliJ Spring Boot 3.1.1 Java 17 Gradle Lombok DB : MySQL 먼저 build.gradle을 열어 아래와 같이 Querydsl 관련 설정을 추가한다. plugins { id 'java' id 'org.springframework.boot' version '3.1.1' id 'io.spring.depende.. 2024. 3. 21. JPA N+1 발생 케이스과 MultipleBagFetchException 해결책 Fetch Join을 사용하다 만나는 MultipleBagFetchException 문제에 대해 알아보고, 해결책에 대해 정리 해보자. 목차는 다음과 같다. 프로젝트 요구사항 문제 상황 연관객체 조회 N+1 문제를 해결하기 위해 Fetch Join 해결방안 첫 번째 방안 : Set으로 선언한다. 두번째 방안 : Hibernate default_batch_fetch_size 내가 선택한 방안 : Set 타입으로 변경하고 조회결과를 DTO로 반환 참고자료 회고 프로젝트 요구사항 (문제 상황을 말하기 전에, 나의 프로젝트에 Join 쿼리가 왜 필요한지 설명하고자 한다.) 스터디 방에 참여한 유저 정보(프로필 사진, 스터디 시간, 자신의 공부태그)를 조회해야 한다. 아이디어 구상단계에서 '크아' .. 2024. 3. 20. 이전 1 다음