QueryDsl

    QueryDsl에서 결과를 가져오는 메서드, fetchFirst()와 fetchOne()의 차이

    1. 알고자 하는 것 회사에서 mybatis 쿼리를 querydsl로 전환하는 작업 중, update_date 기준으로 정렬된 n개의 결과 중 첫번째 결과만을 가져오는 쿼리가 있었다. 그런데, 쿼리를 실행하니 다음과 같은 Exception이 발생했다. Caused by: javax.persistence.NonUniqueResultException: result returns more than one elements at org.hibernate.jpa.internal.QueryImpl.getSingleResult.... 단건의 결과가 아닌 여러 건의 결과(Non Unique Result)가 반환되어 발생한 오류였다. 원인이 바로 짐작이 가 쿼리를 확인해보니, 역시나 QueryDsl을 통해 쿼리를 짤 때 ..

    QueryDsl에서 in절에 empty list, null이 올 때 어떻게 처리될까?

    1. 알고자 하는 것 회사에서 동기가 MyBatis로 작성한 쿼리 중, in절에 대해 empty list가 넘어올 때 Syntax 오류가 발생하여 empty list에 대한 방어 코드 작성 후 다시 배포했었던 상황이 있었다. QueryDsl로 작성한 쿼리에 대해서는 in절에 대해서 별다른 문제가 없었던 것으로 기억해서, QueryDsl의 in절의 내부 동작과 함께 in절에서의 여러 케이스에 대한 결과를 비교해보고자 한다. QueryDsl에서 in query를 사용할 때 List에 empty list가 올 때의 결과 QueryDsl에서 in query를 사용할 때 List에 null이 올 때의 결과 QueryDsl에서 in query의 내부 동작 2. 알게된 것 QueryDsl에서 in절을 테스트 하기..

    No-Offset 적용을 통한 무한 스크롤 방식의 페이징 쿼리 성능 개선

    프로젝트 리팩토링을 진행하며, 무한 스크롤 방식의 페이징이 적용되어 있는 기능에 대해 효율적인 성능 개선 방식을 학습하게 되어 신나게 기록하게 되었따. 페이징 기능은 대량의 데이터를 한꺼번에 조회할 때, 성능의 저하가 발생하므로 일정량의 개수로 데이터를 page 단위로 나누어 조회하는 방식으로, 목록 조회 시 필수적으로 구현되는 기능 중 하나이다. 이러한 페이징은 보통 다음과 같이 limit과 offset을 사용한 일반적인 방식으로 구현된다. SELECT * FROM member ORDER BY id DESC OFFSET pageNum * pageSize LIMIT pageSize 하지만 이러한 페이징 방식은 데이터가 많아질수록 과거의 값을 조회할 때 다음과 같은 이유로 인해 성능이 저하된다. - 매번..

    exists 메서드 성능 개선 - count vs exists

    2월 중순에 마무리 되었던 프로젝트에 대해 리팩토링을 진행하고자 코드를 찬찬히 훑던 중, QueryDsl로 exists 관련 메서드를 구현한 부분에서 개선점이 발견되어 성능을 개선해보았다. 일반적으로 많이 사용하는 방식이자 QueryDsl에서 구현되어있는 방식인 exists 메서드의 성능 측면 문제점을 먼저 비교해보고, 개선한 방식에 대해서 설명한다. 일반적인 exists 관련 쿼리는 아래와 같이 구현한다. select exists( select 1 from member where age = 1); exists 내 서브쿼리를 통해 조건에 해당하는 컬럼이 존재하는지를 반환하는 형태의 쿼리를 이용한다. 스프링 내에서 JpaRepository를 이용해 간단한 조건에 대한 exists 메서드는 다음과 같이 Na..

    order by 조건 설정 - 현재 기준 n일 미만 내 작성된 게시글 상위에 정렬

    - 구현해야 하는 조건 : Request Parameter의 sortBy 값에 따라 0일 경우 작성일 기준 최신순 정렬 / 1일 경우 인기순으로 정렬하되, 현재 날짜 기준 일주일 미만의 게시글은 상위에, 일주일 이후의 게시글은 하위에 우선적으로 정렬한다. 위 조건에 따라서, 기본적인 JPA 기능만으로는 동적 쿼리를 작성하기 힘들다고 판단해 QueryDSL을 통해 구현하였다. sortBy = 0일 경우 작성일 기준 최신순 정렬에 해당하는 로직은 작성일 기준 내림차순 정렬만 수행하면 쉽게 구현할 수 있다. 그러나 sortBy=1일 경우 현재 날짜를 기준으로 7일 미만의 게시글을 상위, 이후 게시글은 하위에 정렬해야 하는 부분에서 어려움이 있었다. 최초에 구상해 본 QueryDSL의 orderBy 로직은 아래..