Section 1. Querydsl
1. Qdomain 생성
- Querydsl 을 사용하기 위해서 Qdomain 생성
- Maven의 compile 명령 수행
- 기존에 존재하던 Entity 객체에 매핑되는 Qdomain 모두 생성
2. 상품 조회 조건 DTO
- 상품 조회 조건
- 상품 등록일
- 상품 판매 상태
- 상품명 또는 상품 등록자 아이디
- 상품 조회 조건을 담을 ItemSearchDto 클래스 생성
3. Querydsl & Spring Data Jpa
- Querydsl 과 Spring Data Jpa 를 함께 사용하기 위해서는 사용자 정의 리포지토리가 필요함
- 아래와 같은 단계를 거치며 구현하면 됨
① 사용자 정의 인터페이스 작성
② 사용자 정의 인터페이스 구현
③ Spring Data Jpa 리포지토리에서 사용자 정의 인터페이스 상속
4. 사용자 정의 인터페이스 작성
- 상품 조회 조건을 담고 있는 itemSearchDto 객체와 페이징 정보를 담고 있는 pageable 객체를 파라미터로 받고, Page<Item> 객체를 반환
5. 사용자 정의 인터페이스 구현
- 클래스명 끝에 "Impl" 를 붙여야 정상적으로 동작함
- 클래스 생성 및 사용자 정의 인터페이스 구현, DI
- BooleanExpression 을 통해 where 절에 적용될 조회 조건을 생성
- BooleanExpresiion 값이 null 이면 해당 조회 조건을 사용하지 않겠다는 의미 (=all)
- 상품 등록일 조건
- 상품 판매 상태 조건
- 상품명 또는 상품 등록자 아이디 조건
- QueryFactory 를 이용하여 Querydsl 쿼리문 생성
- offset : 데이터를 가지고 올 시작 인덱스를 지정
- limit : 한 번에 가지고 올 최대 개수를 지정
- fetchResult() 메소드를 이용하여 조회 대상 리스트 및 전체 개수를 포함하는 QueryResults 객체 반환
- Page 클래스의 구현체인 PageImpl 객체로 반환
6. 사용자 정의 인터페이스 상속
- JpaRepository 를 구현한 ItemRepository 에서 ItemRepositoryCustom 을 상속
7. ItemService 수정
- 위에서 만든 사용자 정의 조회문(=메소드)을 수행하는 로직 추가
- 조회 기능이므로 읽기 전용 상태로 지정
8. ItemController 수정
- Mapping 파라미터로 객체를 지정하면(ItemSearchDto) 자동으로 new 객체 생성
- Get 방식과 Post 방식의 데이터 전달 방법에 대한 궁금증 (참고)
- URL을 통해 페이지 번호가 넘어오는 경우 @PathVariable 로 변수 값 매핑
- @PathVariable 과 Optional 의 관계에 대한 궁금증 (참고)
// PageRequest.of() 를 통해서 Pageable 객체 생성
// 첫 번째 파라미터는 조회할 페이지 번호, 두 번째는 한 번에 가져올 데이터 수
PageRequest.of(page.isPresent() ? page.get() : 0, 3);
// View 단에서 하단에 보여줄 페이지 번호의 최대 개수 설정
model.addAttribute("maxPage", 5);