사랑하애오
article thumbnail

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);
profile

사랑하애오

@사랑하애

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!