-
[Querydsl] querydsl로 동적으로 sort하기Spring 2022. 3. 2. 15:35
querydsl을 쓸 때 항상 난 두가지 점이 불편했다.
1. 동적인 소팅이 쉽지 않다는 점,
2. slice을 위한 코드가 저렇게 지저분하게 남는다는 점
querydsl에서 paging으로 sort을 하려고 하면 OrderSpecifier등을 써 해야하는데 그 과정이 생각보다 참 복잡시럽다.
그래서 찾아본 결과 김영한 선생님께서 정말 멋있고 간편한 방법을 만들어놓으셨다.
Querydsl 지원클래스 커스텀 하기
스프링 데이터가 제공하는 QuerydslRepositorySupport가 지닌 한계를 극복하기 위해 직접 만든 김영한선생님의 Querydsl 지원 클래스의 이름은 Querydsl4RepositorySupport 다.
Querydsl4RepositorySupport의 장점
- 스프링 데이터가 제공하는 페이징을 편리하게 변환
- 페이징과 카운트 쿼리 분리 가능
- 스프링 데이터 Sort 지원
- select(), selectFrom()으로 시작 가능
- entitymanager, queryfactory을 제공해준다.
생성자와 주입용 함수이다.
생성자를 통해 paging sort의 기준이 될 도메인의 클래스속성을 넣어준다.
주입용함수를 통해 생성자가 넣어준 도메인을 querydsl에 paging sort기준으로 설정해주고,
entityManger와 queryFactory을 주입해준다.
필드에 주입해놓은 queryFactory와 querydsl, entitymanager을 get함수로 만들어 쓸수있게 만들었다.
select와 selectFrom이라는 queryFactory의 함수와 동명의 함수를 만들어 querydsl을 function파라미터를 통해 적용할 수 있도록 만들었다.
불필요한 반복되는 paging 인터페이스들을 한번에 해결해주는 함수이다.
파라미터로 function을 받아 적용시켜 querydsl내장함수인 applyPagination으로 paging과 sort을 한다.
추가함수
김영한선생님께서 만든 지원 클래스에선 page지원 함수만 있고 slice지원 함수가 없었다.
그래서 내가 커스텀해서 지저분하게라도 만들었다.
slicing은 paging과 다르게 limit에서 값을 한줄 더 받아 다음데이터가 있는지 체크 후 체크가 되면 추가여부를 boolean으로 리턴해야한다.
때문에 내장 함수 applyPagination을 쓰지 않고 직접 limit offset함수를 쓰고, applysorting함수를 써 paging sort을 할수잇또록 구현했다.
Repository에 적용
Querydsl4RepositorySupport을 상속을 받고, 생성자를 통해 paging sort의 기준 도메인을 넣어준다.
querydsl이나 다른 것들을 굳이 넣을 필요 없이 apply류 함수들을 쓰고, function인터페이스를 써서 넣어주면 불필요하게 slicing하는 작업을 반복하거나, limit offset을 안넣어줘도 된다.
김영한, 이동욱 선생님들 불필요한 작업을 줄이기 위해 클래스 만드는거 너무 멋있다 진짜
'Spring' 카테고리의 다른 글
[Querydsl] count한 컬럼을 바로 정렬기준으로 쓰기 (0) 2022.03.03 [Spring] controller pageable에 디폴트값 넣어주기 (0) 2022.03.03 [Spring]Assertions의 contains 상황별로 달리 사용하기 (0) 2022.02.20 [Spring] 개발 편의 오픈소스 spring devtools (0) 2022.01.18 [Spring] Cascade관계에서 추가로 활용하면 좋을 옵션 orphanRemoval (0) 2022.01.18