Spring Boot

[QUERYDSL] querydsl 전용 메서드/라이브러리 정리

재원쓰 2023. 2. 18. 21:10

com.querydsl.core.types.Projections

querydsl에서의 Projections를 활용하면 더 편하게 사용할 수 있다. 다만, JPA가 dto를 만들어줄 때 기본생성자가 필요해서 MemberDto에 @NoArgsConstructor를 추가한다.

 

Projections.constructor

조회를 원하는 필드를 포함한 생성자가 반드시 있어야 한다. 그리고 dto에서 생성자의 파라미터들의 타입과 순서가 select 절에서의 타입과 순서와 일치해야한다. 또한 compile 전에 에러를 잡아주지 못한다는 단점이 있다.

 

Projections.fields

Projections.fields 방식은 dto에서 정의한 필드의 이름과 select절에서의 각 필드명이 일치해야 한다. 만약 일치할 수 없는 상황이라면 .as("별칭")을 주면 된다.

 

Projections.bean

Projections.bean 은 setter 기반이라서 MemberDto에 반드시 Setter가 있어야 한다. 

 

Projections.list

 

alias 설정하기

 .as(), ExpressionUtils.as()

만약 UserDto와 같은 class가 있어서 username 이 아닌 name 이라는 필드값으로 조회해야되는 경우, 위에서 언급한 바와 같이 alias를 설정해주면 된다.

그리고, 서브 쿼리에 alias를 적용해야한다면 ExpressionUtils.as() 문법을 사용하면 된다.

 

전역에서 셀렉트문 가져와서 사용하기

Expressions.string 어쩌구

 

동적 정렬할 때 쓰임

Expressions.stringPath

 

동적쿼리

BooleanBuilder

조건문만 봐도, 파라미터로 받아오는 username이나 age가 null 일때와 아닐때 모두 쿼리문에 동적으로 적용되는 것을 알 수 있다. 실무에서는 if문을 안쓰고 삼항연산자를 써서 ageCond == null ? null : builder.and(member.age.eq(ageCond) 로 사용하기도 했다.

 

Where문 다중 파라미터 사용

BooleanBuilder 대비 더 깔끔하게 코드를 짤 수 있는 방법이다. 조건 자체를 메서드로 한번 더 뽑아서 BooleanExpression 타입으로 반환하게 만든다. 이럴 경우, 만약 usernameEq가 null 이면 where절에 null이 들어가고, where절에서의 null은 무시되므로 동적 쿼리가 가능해진다. 메서드명이 명확하므로 앞서 BooleanBuilder로 조건문을 일일이 다 살피던 방식과 다르게 굳이 조건문을 자세히 살펴보지 않아도 바로 쿼리문을 이해할 수 있다.

 

또 다른 장점은 allEq와 같이 BooleanExpression을 조합해서 사용할 수 있다는 점이다. 다만 .and와 같이 붙여서 사용할 때는 if 문 등으로 분기하여 null 체크를 반드시 해줘야한다.

 

끝으로 이렇게 BooleanExpression을 만들어놓으면 재사용성이 높다는 장점이 있다. 만든 검색조건문을 member 엔티티를 조회하는 곳에서 뿐만 아니라 다른 형태의 결과를 조회할 때도 사용할 수 있다. 보통 이러한 BooleanExpression 자체를 파라미터만 넣으면 바로 사용할 수 있도록 공통화하는 구조도 많이 사용한다.