Querydsl

Codren·2021년 9월 22일
1

Spring Boot 쇼핑몰

목록 보기
7/32

Section 1. Querydsl

1. Querydsl

SQL 쿼리문을 문자열이 아닌 소스코드로 작성하도록 지원하는 빌더 API (프레임워크)



2. Querydsl 의 장점

    ① 고정된 SQL 문이아닌 조건에 맞게 동적으로 쿼리 생성 가능
    ② 제약 조건 조립 및 가독성 향상
    ③ 컴파일 시점에 오류를 발견할 수 있음
    ④ 자동 완성 기능으로 인한 생산성 향상




3. Querydsl 의존성 주입

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>4.3.1</version>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>4.3.1</version>
</dependency>




4. Qdomain 플러그인 추가

  • 엔티티를 기반으로 접두사(prefix) 'Q'가 붙는 클래스를 자동으로 생성하는 플러그인
  • Querydsl 수행 시 엔티티가 아닌 Qdomain 객체를 사용
<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources/java</outputDirectory>
                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>




5. Qdomain 생성

  • maven 프로젝트 compile 수행

  • target/generated-sources 폴더에 Qdomain 파일 생성됨
  • Item 클래스의 모든 필드들에 대해서 사용 가능한 operation을 호출하는 메소드 정의됨




6. JPAQueryFactory 를 이용한 상품 조회

// @PersistenceContext 어노테이션으로 bean 주입
@PersistenceContext
EntityManager em;

// 쿼리를 동적으로 생성하기 위해 JPAQueryFactory 객체 생성 (매개변수로 엔티티 매니저 받음)
JPAQueryFactory queryFactory = new JPAQueryFactory(em);

// Querydsl을 통해 쿼리를 생성하기 위해 Qdomain 객체 생성
QItem qItem = QItem.item;

// querydsl 쿼리문을 받을 JPAQuery 객체 생성
// SQL 문자열이 아닌 자바 소스코드를 이용해 쿼리 생성 
// select -> 조회, where -> 조건문, orderBy -> 정렬
JPAQuery<Item> query = queryFactory.selectFrom(qItem)
                .where(qItem.itemSellStatus.eq(ItemSellStatus.SELL))
                .where(qItem.itemDetail.like("%" + "테스트 상품 상세 설명" + "%"))
                .orderBy(qItem.price.desc());




7. 쿼리 전달 및 결과




8. JPAQuery 데이터 반환 메소드

메소드기능
List<T> fetch()조회 결과 리스트 반환
T fetchOne()조회 결과 대상이 1건인 경우
T fetchFirst()조회 대상 중 1건만 반환
Long fetchCount()조회 대상 개수 반환
QueryResult<T> fetchResults()조회한 리스트와 전체 개수 반환



Section 2. QuerydslPredicateExecutor

1.Predicate

쿼리문의 where 조건문을 메소드로 정의해놓은 것



2. QuerydslPredicateExecutor 상속

  • Repository 에 Predicate 를 매개변수로 전달하기 위해 QuerydslPredicateExecutor 상속




3. QuerydslPredicateExecutor 인터페이스 정의 메소드

메소드기능
long count(Predicate)데이터의 총 개수 반환
boolean exists(Predicate)데이터 존재 여부 반환
Iterable findAll(Predicate)모든 데이터 반환
Page<T> findAll(Predicate, Pageable)조건에 맞는 페이지 데이터 반환
Iterable findAll(Predicate, Sort)정렬된 데이터 반환
T findOne(Predicate)조건에 맞는 데이터 1개 반환




4. QuerydslPredicateExecutor 를 이용한 상품 조회

  • 상품 판매 상태가 SELL 인 것과 SOLD_OUT 인 것으로 나눔
// 쿼리문의 where 역할을 수행하는 Predicate 를 담는 객체 생성
BooleanBuilder booleanBuilder = new BooleanBuilder();

// where 조건부 설정
booleanBuilder.and(item.itemDetail.like("%" + itemDetail + "%"));
booleanBuilder.and(item.price.gt(price));
booleanBuilder.and(item.itemSellStatus.eq(ItemSellStatus.SELL));

// 0 번째 페이지, 5개의 데이터
// findAll() 메소드의 매개변수로 predicate, pageable 전달
// 반환된 결과는 Page<Item> 타입으로 받음
Pageable pageable = PageRequest.of(0, 5);
Page<Item> itemPagingResult = itemRepository.findAll(booleanBuilder, pageable);

// 반환된 페이지에서 content 부분만을 List<Item> 타입으로 반ㄷ음
List<Item> resultItemList = itemPagingResult.getContent();




5. 쿼리 전달 및 결과

0개의 댓글