Section 1. Querydsl
1. Qdomain 생성
- Querydsl 을 사용하기 위해서 Qdomain 생성
- Maven의 compile 명령 수행
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F2a8bef21-8d5e-4946-b447-e0045d4f8d8e%2Fimage.png)
- 기존에 존재하던 Entity 객체에 매핑되는 Qdomain 모두 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F87d21562-69b2-48dc-ae2a-f8f8fcfa554f%2Fimage.png)
2. 상품 조회 조건 DTO
- 상품 조회 조건
- 상품 등록일
- 상품 판매 상태
- 상품명 또는 상품 등록자 아이디
- 상품 조회 조건을 담을 ItemSearchDto 클래스 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F4db392cf-e90a-4c59-b8e4-b65eae61ea05%2Fimage.png)
3. Querydsl & Spring Data Jpa
- Querydsl 과 Spring Data Jpa 를 함께 사용하기 위해서는 사용자 정의 리포지토리가 필요함
- 아래와 같은 단계를 거치며 구현하면 됨
① 사용자 정의 인터페이스 작성
② 사용자 정의 인터페이스 구현
③ Spring Data Jpa 리포지토리에서 사용자 정의 인터페이스 상속
4. 사용자 정의 인터페이스 작성
- 상품 조회 조건을 담고 있는 itemSearchDto 객체와 페이징 정보를 담고 있는 pageable 객체를 파라미터로 받고, Page<Item> 객체를 반환
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F9d3ee32f-dd81-4662-856f-8ed609fa5a6f%2Fimage.png)
5. 사용자 정의 인터페이스 구현
- 클래스명 끝에 "Impl" 를 붙여야 정상적으로 동작함
- 클래스 생성 및 사용자 정의 인터페이스 구현, DI
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F36cc5828-2afa-419a-a126-352fb1871f56%2Fimage.png)
- BooleanExpression 을 통해 where 절에 적용될 조회 조건을 생성
- BooleanExpresiion 값이 null 이면 해당 조회 조건을 사용하지 않겠다는 의미 (=all)
- 상품 등록일 조건
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F92322d51-8dcc-45e9-ab4a-834ab4be657b%2Fimage.png)
- 상품 판매 상태 조건
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F170c1961-0493-430b-b27a-1e050f1ba6ba%2Fimage.png)
- 상품명 또는 상품 등록자 아이디 조건
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F95489a85-b7b4-4de2-a0d7-d1a05cb8c1ba%2Fimage.png)
- QueryFactory 를 이용하여 Querydsl 쿼리문 생성
- offset : 데이터를 가지고 올 시작 인덱스를 지정
- limit : 한 번에 가지고 올 최대 개수를 지정
- fetchResult() 메소드를 이용하여 조회 대상 리스트 및 전체 개수를 포함하는 QueryResults 객체 반환
- Page 클래스의 구현체인 PageImpl 객체로 반환
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F089b8317-89dc-43a1-8b33-63d8af39cfcd%2Fimage.png)
6. 사용자 정의 인터페이스 상속
- JpaRepository 를 구현한 ItemRepository 에서 ItemRepositoryCustom 을 상속
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F38ffbaf8-a141-4e83-a770-50ecc29daab1%2Fimage.png)
7. ItemService 수정
- 위에서 만든 사용자 정의 조회문(=메소드)을 수행하는 로직 추가
- 조회 기능이므로 읽기 전용 상태로 지정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fe7615927-3826-4837-965b-69a9ed354da2%2Fimage.png)
8. ItemController 수정
- Mapping 파라미터로 객체를 지정하면(ItemSearchDto) 자동으로 new 객체 생성
- Get 방식과 Post 방식의 데이터 전달 방법에 대한 궁금증 (참고)
- URL을 통해 페이지 번호가 넘어오는 경우 @PathVariable 로 변수 값 매핑
- @PathVariable 과 Optional 의 관계에 대한 궁금증 (참고)
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F90e0c725-ebf4-45cf-a80d-eaea326dfdb4%2Fimage.png)
// PageRequest.of() 를 통해서 Pageable 객체 생성
// 첫 번째 파라미터는 조회할 페이지 번호, 두 번째는 한 번에 가져올 데이터 수
PageRequest.of(page.isPresent() ? page.get() : 0, 3);
// View 단에서 하단에 보여줄 페이지 번호의 최대 개수 설정
model.addAttribute("maxPage", 5);