[Spring QueryDsl] DTO 매핑을 위한 Projection 사용 방법
·
Spring
QueryDSL에서는 Entity가 아닌 DTO로 직접 결과를 매핑할 수 있도록 여러 가지 Projection 방식을 제공한다.이 글에서는 그 중 자주 쓰는 세 가지 방식과 각각의 특징을 정리한다.1. Projections.bean (Setter 방식)Setter 메서드를 통해 값을 주입한다.DTO에 기본 생성자와 public setter가 있어야 한다.public void findDtoBySetter() { List members = queryFactory .select(Projections.bean(MemberDto.class, member.name, member.age )) .from(member) .fe..
[Spring QueryDsl] BooleanBuilder로 동적 조건 구성하기
·
Spring
QueryDSL을 사용할 때, 검색 조건이 유동적으로 바뀌는 상황에서는 조건문을 동적으로 구성할 수 있어야 한다.이때 사용하는 도구가 BooleanBuilder다.BooleanBuilder 기본 구조BooleanBuilder builder = new BooleanBuilder();builder.and(조건);builder.or(다른조건);조건을 하나씩 누적해서 붙일 수 있고,필요 없는 조건은 넣지 않으면 된다.BooleanExpression vs PredicateQueryDSL 조건은 두 가지로 구성된다.BooleanExpression: and, or 조합이 가능함 (주로 사용)Predicate: 단순 조건 표현, 조합이 어려움따라서 실무에서는 대부분 BooleanExpression 기반으로 메서드를 만..
[Spring QueryDsl] 벌크 연산(Bulk Operation) 사용 시 주의점
·
Spring
JPA에서는 대량 데이터를 한 번에 수정하거나 삭제할 수 있도록 벌크 연산(Bulk Operation) 기능을 제공한다.QueryDSL이나 JPQL을 사용할 때 .execute()로 실행된다.기본 사용 방식UPDATE 예시queryFactory .update(member) .set(member.money, 0) .execute();member 테이블의 모든 money 값을 0으로 일괄 수정한다.조건이 없으므로 전체 레코드가 대상이다.DELETE / INSERT 예시queryFactory.delete(member) .where(member.age.gt(60)) .execute();queryFactory.insert(member) .columns(member.name, mem..
[Spring QueryDsl] Sub Query는 가급적 조인으로 대체하거나 쿼리 분할로 해결하자
·
Spring
QueryDSL에서도 서브쿼리(SubQuery)를 사용할 수 있다.하지만 복잡한 쿼리나 데이터 양이 많아질수록 성능 이슈가 발생할 수 있으므로, 가능하다면 조인 방식으로 대체하거나 쿼리를 분리해서 처리하는 것이 더 안전하다. 특히 IN 서브쿼리는 최적화가 어렵고, 쿼리 성능이 급격히 떨어질 수 있다.1. SELECT 절 – 서브쿼리로 컬럼 집계특정 컬럼 값에 대해 서브쿼리를 함께 조회할 수 있다.아래는 학원 이름과 해당 학원 소속 학생 수를 함께 조회하는 예제다.public List findAllStudentCount() { return queryFactory .select(Projections.fields(StudentCount.class, academy.name...
[Spring QueryDsl] QueryDsl에서 Pageable Sort 파라미터를 사용하는 방법
·
Spring
이번 글에서는 Spring Data JPA와 QueryDSL을 함께 사용할 때,Pageable 객체의 정렬 정보(Sort)를 활용해 QueryDSL의 OrderSpecifier로 변환하는 방법을 정리한다.OrderSpecifier란?OrderSpecifier는 QueryDSL에서 정렬 조건을 표현할 때 사용하는 객체다.정렬 기준 컬럼과 정렬 방향을 함께 담고 있으며, orderBy() 메서드에 넘겨주면 실제 쿼리에서 정렬 조건으로 사용된다.정렬 방향은 com.querydsl.core.types.Order 열거형을 사용하며, ASC(오름차순) 또는 DESC(내림차순) 중 하나를 지정할 수 있다.QueryDSL의 orderBy 메서드정렬은 다음과 같은 방식으로 처리된다.public Query orderBy(..